﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

// Форма редактирования регистрации изменений обмена объектов на указанном узле.
// Может быть открыта со следующими параметрами:
// 
// УзелОбмена                  - ПланОбменаСсылка - Ссылка на узел обмена для оперирования.
// ЗапрещеноВыбиратьУзелОбмена - Булево           - Флаг того, что пользователю запрещено изменять указанный узел.
//                                                  Параметр УзелОбмена должен быть задан.
// ИменаСкрываемыхМетаданных   - СписокЗначений   - Содержит имена метаданных, которые будут исключены из дерева
//                                                  регистрации.
//
// При работе с подсистемой дополнительных отчетов и обработок используются дополнительные параметры:
//
// ДополнительнаяОбработкаСсылка - Произвольный - Ссылка на элемент справочника дополнительных отчетов и обработок,
//                                                вызывающий форму.
//                                                При использовании должен быть заполнен параметр "ОбъектыНазначения".
// ОбъектыНазначения             - Массив       - Объекты для обработки. Будет использован первый элемент для открытия
//                                                формы регистрации объекта на узлах. При использовании должен быть
//                                                заполнен параметр "ИдентификаторКоманды".
//

#Область ОписаниеПеременных

&НаКлиенте
Перем ТекущаяСтрокаМетаданных;

#КонецОбласти

#Область ПрограммныйИнтерфейс

#Область ДляВызоваИзДругихПодсистем

// СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки

// АПК:78-выкл дополнительная обработка

// Экспортный обработчик команд для подсистемы дополнительных отчетов и обработок.
//
// Параметры:
//     ИдентификаторКоманды - Строка - идентификатор команды для выполнения.
//     ОбъектыНазначения    - Массив из ЛюбаяСсылка - ссылки для обработки. Здесь не используется,
//                            ожидается, что аналогичный параметр был передан и обработан при создании формы.
//     СозданныеОбъекты     - Массив из ЛюбаяСсылка - возвращаемый массив ссылок на созданные объекты. 
//                            В данной обработке не используется.
//
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, СозданныеОбъекты) Экспорт
	
	Если ИдентификаторКоманды = "ОткрытьФормуРедактированияРегистрации" Тогда
		
		Если ПараметрОбъектРегистрации <> Неопределено Тогда
			// Используем параметры, полученные при создании на сервере.
			
			ПараметрыФормыРегистрации = Новый Структура;
			ПараметрыФормыРегистрации.Вставить("ОбъектРегистрации",  ПараметрОбъектРегистрации);
			ПараметрыФормыРегистрации.Вставить("ТаблицаРегистрации", ПараметрТаблицаРегистрации);

			ОткрытьФорму(ИмяЭтойФормы + "Форма.УзлыРегистрацииОбъекта", ПараметрыФормыРегистрации);
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры
// АПК:78-вкл

// Конец СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки

#КонецОбласти

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	УстановитьУсловноеОформление();
	
	ПроверитьВерсиюИРежимСовместимостиПлатформы();
	
	ПараметрТаблицаРегистрации = Неопределено;
	ПараметрОбъектРегистрации  = Неопределено;
	
	ОткрытиеСУзломПараметром = Ложь;
	ТекущийОбъект = ЭтотОбъект();
	ИмяЭтойФормы = ПолучитьИмяФормы();
	// Определяем что создают
	Если Параметры.ДополнительнаяОбработкаСсылка = Неопределено Тогда
		// Запуск автономно, возможно с параметром-узлом.
		УзелОбменаСсылка = Параметры.УзелОбмена;
		Параметры.Свойство("ЗапрещеноВыбиратьУзелОбмена", ЗапрещеноВыбиратьУзелОбмена);
		ОткрытиеСУзломПараметром = Истина;
		
	Иначе
		// Вызов из подсистемы дополнительных отчетов и обработок.
		Если ТипЗнч(Параметры.ОбъектыНазначения) = Тип("Массив") И Параметры.ОбъектыНазначения.Количество() > 0 Тогда
			
			// Нас открывают с указанием объекта.
			ОбъектНазначения = Параметры.ОбъектыНазначения[0];
			Тип = ТипЗнч(ОбъектНазначения);
			
			Если ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип) Тогда
				УзелОбменаСсылка = ОбъектНазначения;
				ОткрытиеСУзломПараметром = Истина;
			Иначе
				// Преобразуем в два внутренних параметра.
				Описание = ТекущийОбъект.ХарактеристикиПоМетаданным(ОбъектНазначения.Метаданные());
				Если Описание.ЭтоСсылка Тогда
					ПараметрОбъектРегистрации = ОбъектНазначения;
					
				ИначеЕсли Описание.ЭтоНабор Тогда
					// Структура и имя таблицы
					ПараметрТаблицаРегистрации = Описание.ИмяТаблицы;
					ПараметрОбъектРегистрации  = Новый Структура;
					Для Каждого Измерение Из ТекущийОбъект.ИзмеренияНабораЗаписей(ПараметрТаблицаРегистрации) Цикл
						ТекИмя = Измерение.Имя;
						ПараметрОбъектРегистрации.Вставить(ТекИмя, ОбъектНазначения.Отбор[ТекИмя].Значение);
					КонецЦикла;
					
				КонецЕсли;
			КонецЕсли;
			
		Иначе
			ВызватьИсключение СтрЗаменить(
				НСтр("ru = 'Некорректные параметры объектов назначения открытия команды ""%1""'"),
				"%1", Параметры.ИдентификаторКоманды);
		КонецЕсли;
		
	КонецЕсли;
	
	// Настройки объекта инициализируем всегда.
	ТекущийОбъект.ПрочитатьНастройки();
	ТекущийОбъект.ПрочитатьПризнакиПоддержкиБСП();
	ТекущийОбъект.ПрочитатьПризнакиПоддержкиБСД();
	ЭтотОбъект(ТекущийОбъект);
	
	// Остальное инициализируем, только если будем открывать эту форму,
	Если ПараметрОбъектРегистрации <> Неопределено Тогда
		Возврат;
	КонецЕсли;
	Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.Основная;
	// Список запретных объектов метаданных из параметров.
	Параметры.Свойство("ИменаСкрываемыхМетаданных", Объект.ИменаСкрываемыхМетаданных);
	ДополнитьИменаСкрываемыхМетаданных();
	
	Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница = Элементы.СтраницаПустая;
	Параметры.Свойство("ЗапрещеноВыбиратьУзелОбмена", ЗапрещеноВыбиратьУзелОбмена);
	
	НаименованиеУзлаПланаОбмена = Строка(УзелОбменаСсылка);
	
	ЗаполнитьДополнительнуюИнформацию();
	
	Если Не ПроконтролироватьНастройки() И ОткрытиеСУзломПараметром Тогда
		
		ТекстСообщения = СтрЗаменить(
			НСтр("ru = 'Для ""%1"" редактирование регистрации объектов недоступно.'"),
			"%1", НаименованиеУзлаПланаОбмена);
		
		ВызватьИсключение ТекстСообщения;
		
	КонецЕсли;
		
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
	
	Если ЗавершениеРаботы Тогда
		Возврат;
	КонецЕсли;
	
	Если ЗакрытьФормуБезусловно Тогда
		Возврат;
	КонецЕсли;
	
	Если ДлительнаяОперацияЗапущена Тогда
		Отказ = Истина;
		Оповещение = Новый ОписаниеОповещения("ПодтвердитьЗакрытиеФормыЗавершение", ЭтотОбъект);
		ПоказатьВопрос(Оповещение, НСтр("ru = 'Прервать выполнение регистрации данных?'"), РежимДиалогаВопрос.ДаНет);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
	
	Если ЗавершениеРаботы Тогда
		Возврат;
	КонецЕсли;
	
	Если ДлительнаяОперацияЗапущена Тогда
		ЗавершитьВыполнениеДлительнойОперации(ФоновоеЗаданиеИдентификатор);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
	
	Если Не (ТипЗнч(ИсточникВыбора) = Тип("ФормаКлиентскогоПриложения")
			И ИсточникВыбора.КлючУникальности = КлючУникальностиФормыВыбораРезультатаЗапроса) Тогда
		Возврат;
	КонецЕсли;
	
	// Результат выбора запроса, ожидаем структуру.
	Если ТипЗнч(ВыбранноеЗначение) <> Тип("Структура") 
		Или (Не ВыбранноеЗначение.Свойство("ДействиеВыбора"))
		Или (Не ВыбранноеЗначение.Свойство("ДанныеВыбора"))
		Или ТипЗнч(ВыбранноеЗначение.ДействиеВыбора) <> Тип("Булево")
		Или ТипЗнч(ВыбранноеЗначение.ДанныеВыбора) <> Тип("Строка") Тогда
		Ошибка = НСтр("ru = 'Неожиданный результат выбора из консоли запросов'");
	Иначе
		Ошибка = КонтрольСсылокДляВыбораЗапросом(ВыбранноеЗначение.ДанныеВыбора);
	КонецЕсли;
	
	Если Ошибка <> "" Тогда 
		ПоказатьПредупреждение(,Ошибка);
		Возврат;
	КонецЕсли;
		
	Если ВыбранноеЗначение.ДействиеВыбора Тогда
		Текст = НСтр("ru = 'Зарегистрировать результат запроса
		                 |на узле ""%1""?'"); 
	Иначе
		Текст = НСтр("ru = 'Отменить регистрацию результата запроса
		                 |на узле ""%1""?'");
	КонецЕсли;
	Текст = СтрЗаменить(Текст, "%1", Строка(УзелОбменаСсылка));
					 
	ЗаголовокВопроса = НСтр("ru = 'Подтверждение'");
	
	Оповещение = Новый ОписаниеОповещения("ОбработкаВыбораЗавершение", ЭтотОбъект, Новый Структура);
	Оповещение.ДополнительныеПараметры.Вставить("ВыбранноеЗначение", ВыбранноеЗначение);
	ПоказатьВопрос(Оповещение, Текст, РежимДиалогаВопрос.ДаНет, , , ЗаголовокВопроса);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	Если ИмяСобытия = "ИзменениеРегистрацииОбменаДаннымиОбъекта" Тогда
		ЗаполнитьКоличествоРегистрацийВДереве();
		ОбновитьСодержимоеСтраницы();

	ИначеЕсли ИмяСобытия = "ИзменениеДанныхУзлаОбмена" И УзелОбменаСсылка = Параметр Тогда
		УстановитьЗаголовокНомеровСообщений();
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки)
	// Автоматические настройки
	ТекущийОбъект = ЭтотОбъект();
	ТекущийОбъект.СохранитьНастройки();
	ЭтотОбъект(ТекущийОбъект);
КонецПроцедуры

&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
	
	Если ПараметрОбъектРегистрации <> Неопределено Тогда
		// Будет работа с другой формой.
		Возврат;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(Параметры.УзелОбмена) Тогда
		УзелОбменаСсылка = Параметры.УзелОбмена;
	Иначе
		УзелОбменаСсылка = Настройки["УзелОбменаСсылка"];
		// Если восстановленный узел обмена был удален, то очищаем его.
		Если УзелОбменаСсылка <> Неопределено 
		    И ПланыОбмена.ТипВсеСсылки().СодержитТип(ТипЗнч(УзелОбменаСсылка))
		    И ПустаяСтрока(УзелОбменаСсылка.ВерсияДанных) Тогда
			УзелОбменаСсылка = Неопределено;
		КонецЕсли;
	КонецЕсли;
	
	ПроконтролироватьНастройки();
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы
//

&НаКлиенте
Процедура УзелОбменаСсылкаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ТекИмяФормы = ИмяЭтойФормы + "Форма.ВыборУзлаПланаОбмена";
	ТекПараметры = Новый Структура("МножественныйВыбор, НачальноеЗначениеВыбора", Ложь, УзелОбменаСсылка);
	ОткрытьФорму(ТекИмяФормы, ТекПараметры, Элемент);
КонецПроцедуры

&НаКлиенте
Процедура УзелОбменаСсылкаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	Если УзелОбменаСсылка <> ВыбранноеЗначение Тогда
		УзелОбменаСсылка = ВыбранноеЗначение;
		ПодключитьОбработчикОжидания("ОбработкаВыбораУзлаОбмена", 0.1, Истина);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УзелОбменаСсылкаПриИзменении(Элемент)
	ОбработкаВыбораУзлаОбменаСервер();
	РазвернутьДеревоМетаданных();
	ОбновитьСодержимоеСтраницы();
КонецПроцедуры

&НаКлиенте
Процедура УзелОбменаСсылкаОчистка(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
КонецПроцедуры

&НаКлиенте
Процедура ВариантОтбораПоНомеруСообщенияПриИзменении(Элемент)
	УстановитьОтборыВДинамическихСписках();
	ОбновитьСодержимоеСтраницы();
КонецПроцедуры

&НаКлиенте
Процедура ВариантыСпискаОбъектовПриСменеСтраницы(Элемент, ТекущаяСтраница)
	ОбновитьСодержимоеСтраницы(ТекущаяСтраница);
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыДеревоМетаданных
//

&НаКлиенте
Процедура ДеревоМетаданныхПометкаПриИзменении(Элемент)
	ИзменениеПометки(Элементы.ДеревоМетаданных.ТекущаяСтрока);
КонецПроцедуры

&НаКлиенте
Процедура ДеревоМетаданныхПриАктивизацииСтроки(Элемент)
	Если Элементы.ДеревоМетаданных.ТекущаяСтрока <> ТекущаяСтрокаМетаданных Тогда
		ТекущаяСтрокаМетаданных  = Элементы.ДеревоМетаданных.ТекущаяСтрока;
		ПодключитьОбработчикОжидания("НастроитьРедактированиеИзменений", 0.1, Истина);
	КонецЕсли;
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыСписокКонстант

&НаКлиенте
Процедура СписокКонстантПриАктивизацииСтроки(Элемент)
	
	ДоступностьКоманды = Элементы.СписокКонстант.ВыделенныеСтроки.Количество() > 0;
	Элементы.ПоказатьРезультатВыгрузки.Доступность = ДоступностьКоманды;
	
КонецПроцедуры

&НаКлиенте
Процедура СписокКонстантОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	Результат = ДобавитьРегистрациюНаСервере(Истина, ВыбранноеЗначение);
	Элементы.СписокКонстант.Обновить();
	ЗаполнитьКоличествоРегистрацийВДереве();
	СообщитьОРезультатахРегистрации(Результат);
	
	Если ТипЗнч(ВыбранноеЗначение) = Тип("Массив") И ВыбранноеЗначение.Количество() > 0 Тогда
		Элемент.ТекущаяСтрока = ВыбранноеЗначение[0];
	Иначе
		Элемент.ТекущаяСтрока = ВыбранноеЗначение;
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыСписокСсылок

&НаКлиенте
Процедура СписокСсылокПриАктивизацииСтроки(Элемент)
	
	ДоступностьКоманды = Элементы.СписокСсылок.ВыделенныеСтроки.Количество() > 0;
	Элементы.ПоказатьРезультатВыгрузки.Доступность = ДоступностьКоманды;
	
КонецПроцедуры

&НаКлиенте
Процедура СписокСсылокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ТекущаяСсылка = ТекущиеДанныеСпискаСсылок().Ссылка;
	Если Не ЗначениеЗаполнено(ТекущаяСсылка)
		Или Не ЗначениеЗаполнено(СписокСсылокИмяТаблицы) Тогда
		Возврат;
	КонецЕсли;
	СтруктураПараметров = Новый Структура("Ключ, ТолькоПросмотр", ТекущаяСсылка, Истина);
	Если ЭтоГруппа(ТекущаяСсылка) Тогда
		ОткрытьФорму(СписокСсылокИмяТаблицы + ".ФормаГруппы", СтруктураПараметров, ЭтотОбъект);	
	Иначе
		ОткрытьФорму(СписокСсылокИмяТаблицы + ".ФормаОбъекта", СтруктураПараметров, ЭтотОбъект);
	КонецЕсли;

КонецПроцедуры

&НаСервере
Функция ЭтоГруппа(Ссылка)
	
	ОбъектМетаданных = Ссылка.ПолучитьОбъект().Метаданные();
	
	Если (Метаданные.Справочники.Содержит(ОбъектМетаданных) Или Метаданные.ПланыВидовХарактеристик.Содержит(ОбъектМетаданных))
		И ОбъектМетаданных.Иерархический 
		И ОбъектМетаданных.ВидИерархии = Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияГруппИЭлементов Тогда
		
		Если Метаданные.Справочники.Содержит(ОбъектМетаданных) Тогда
			ИмяТаблицы = "Справочник." + ОбъектМетаданных.Имя;
		Иначе
			ИмяТаблицы = "ПланВидовХарактеристик." + ОбъектМетаданных.Имя;
		КонецЕсли;
		
	Иначе
		
		Возврат Ложь;
		
	КонецЕсли;
	
	ТекстЗапроса = 
		"ВЫБРАТЬ
		|	Таблица.Ссылка КАК Ссылка
		|ИЗ
		|	#Таблица КАК Таблица
		|ГДЕ
		|	Таблица.ЭтоГруппа
		|	И Таблица.Ссылка = &Ссылка";
					
	ТекстЗапрос = СтрЗаменить(ТекстЗапроса, "#Таблица", ИмяТаблицы);

	Запрос = Новый Запрос(ТекстЗапрос);
	Запрос.УстановитьПараметр("Ссылка", Ссылка);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	Если РезультатЗапроса.Пустой() Тогда
		Возврат Ложь;
	Иначе
		Возврат Истина;
	КонецЕсли;
	
КонецФункции

&НаКлиенте
Процедура СписокСсылокОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	ОбработкаВыбораДанных(Элемент, ВыбранноеЗначение);
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыСписокНаборовЗаписей

&НаКлиенте
Процедура СписокНаборовЗаписейПриАктивизацииСтроки(Элемент)
	
	ДоступностьКоманды = Элементы.СписокНаборовЗаписей.ВыделенныеСтроки.Количество() > 0;
	Элементы.ПоказатьРезультатВыгрузки.Доступность = ДоступностьКоманды;
	
КонецПроцедуры

&НаКлиенте
Процедура СписокНаборовЗаписейВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	
	ПараметрыЗаписи = СтруктураКлючаНабораЗаписей(Элемент.ТекущиеДанные);
	Если ПараметрыЗаписи <> Неопределено Тогда
		ОткрытьФорму(ПараметрыЗаписи.ИмяФормы, Новый Структура(ПараметрыЗаписи.Параметр, ПараметрыЗаписи.Значение));
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СписокНаборовЗаписейОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	ОбработкаВыбораДанных(Элемент, ВыбранноеЗначение);
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы
//

&НаКлиенте
Процедура ДобавитьРегистрациюОдногоОбъекта(Команда)
	
	Если Не ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		Возврат;
	КонецЕсли;
	
	ТекСтр = Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница;
	Если ТекСтр = Элементы.СтраницаКонстанты Тогда
		ДобавитьРегистрациюКонстантыВСписке();
		
	ИначеЕсли ТекСтр = Элементы.СтраницаСписокСсылок Тогда
		ДобавитьРегистрациюВСписокСсылок();
		
	ИначеЕсли ТекСтр = Элементы.СтраницаНаборЗаписей Тогда
		ДобавитьРегистрациюВНаборЗаписейОтбор();
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюОдногоОбъекта(Команда)
	
	Если Не ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		Возврат;
	КонецЕсли;
	
	ТекСтр = Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница;
	Если ТекСтр = Элементы.СтраницаКонстанты Тогда
		УдалитьРегистрациюКонстантыВСписке();
		
	ИначеЕсли ТекСтр = Элементы.СтраницаСписокСсылок Тогда
		УдалитьРегистрациюИзСпискаСсылок();
		
	ИначеЕсли ТекСтр = Элементы.СтраницаНаборЗаписей Тогда
		УдалитьРегистрациюВНабореЗаписей();
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюОтбор(Команда)
	
	Если Не ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		Возврат;
	КонецЕсли;
	
	ТекСтр = Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница;
	Если ТекСтр = Элементы.СтраницаСписокСсылок Тогда
		ДобавитьРегистрациюВСписокОтбор();
		
	ИначеЕсли ТекСтр = Элементы.СтраницаНаборЗаписей Тогда
		ДобавитьРегистрациюВНаборЗаписейОтбор();
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюОтбор(Команда)
	
	Если Не ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		Возврат;
	КонецЕсли;
	
	ТекСтр = Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница;
	Если ТекСтр = Элементы.СтраницаСписокСсылок Тогда
		УдалитьРегистрациюВСпискеОтбор();
		
	ИначеЕсли ТекСтр = Элементы.СтраницаНаборЗаписей Тогда
		УдалитьРегистрациюВНабореЗаписейОтбор();
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьФормуРегистрацииНаУзлах(Команда)
	
	Если ЗапрещеноВыбиратьУзелОбмена Тогда
		Возврат;
	КонецЕсли;
		
	Данные = ПолучитьТекущийОбъектРедактирования();
	Если Данные <> Неопределено Тогда
		ТаблицаРегистрации = ?(ТипЗнч(Данные) = Тип("Структура"), СписокНаборовЗаписейИмяТаблицы, "");
		ОткрытьФорму(ИмяЭтойФормы + "Форма.УзлыРегистрацииОбъекта",
			Новый Структура("ОбъектРегистрации, ТаблицаРегистрации, ОповещатьОбИзменениях", 
				Данные, ТаблицаРегистрации, Истина), ЭтотОбъект);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПоказатьРезультатВыгрузки(Команда)
	
	ТекущаяСтраница = Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница;
	Результат = Новый Массив;
	
	Если ТекущаяСтраница = Элементы.СтраницаКонстанты Тогда 
		ЭлементФормы = Элементы.СписокКонстант;
		Для Каждого Строка Из ЭлементФормы.ВыделенныеСтроки Цикл
			ТекДанные = ЭлементФормы.ДанныеСтроки(Строка);
			Результат.Добавить(Новый Структура("ФлагТипа, Данные", 1, ТекДанные.МетаПолноеИмя));
		КонецЦикла;
		
	ИначеЕсли ТекущаяСтраница = Элементы.СтраницаНаборЗаписей Тогда
		СписокИзмерений = МассивИменКлючейНабораЗаписей(СписокНаборовЗаписейИмяТаблицы);
		ЭлементФормы = Элементы.СписокНаборовЗаписей;
		Префикс = "СписокНаборовЗаписей";
		Для Каждого Элемент Из ЭлементФормы.ВыделенныеСтроки Цикл
			ТекДанные = Новый Структура();
			Данные = ЭлементФормы.ДанныеСтроки(Элемент);
			Для Каждого Имя Из СписокИзмерений Цикл
				Если Данные.Свойство(Префикс + Имя) Тогда 
					ТекДанные.Вставить(Имя, Данные[Префикс + Имя]);
				КонецЕсли;
			КонецЦикла;
			Результат.Добавить(Новый Структура("ФлагТипа, Данные", 2, ТекДанные));
		КонецЦикла;
		
	ИначеЕсли ТекущаяСтраница = Элементы.СтраницаСписокСсылок Тогда
		ЭлементФормы = Элементы.СписокСсылок;
		Для Каждого Элемент Из ЭлементФормы.ВыделенныеСтроки Цикл
			ТекДанные = ЭлементФормы.ДанныеСтроки(Элемент); // см. ТекущиеДанныеСпискаСсылок
			Результат.Добавить(Новый Структура("ФлагТипа, Данные", 3, ТекДанные.Ссылка));
		КонецЦикла;
		
	Иначе
		Возврат;
		
	КонецЕсли;
	
	Если Результат.Количество() > 0 Тогда
		Текст = ТекстСериализации(Результат);
		ЗаголовокТекста = НСтр("ru = 'Результат стандартной выгрузки (РИБ)'");
		Текст.Показать(ЗаголовокТекста);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура РедактироватьНомераСообщений(Команда)
	
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		ТекИмяФормы = ИмяЭтойФормы + "Форма.НомераСообщенийУзлаПланаОбмена";
		ТекПараметры = Новый Структура("УзелОбменаСсылка", УзелОбменаСсылка);
		ОткрытьФорму(ТекИмяФормы, ТекПараметры, ЭтотОбъект, , , , , РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюКонстанты(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		ДобавитьРегистрациюКонстантыВСписке();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюКонстанты(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		УдалитьРегистрациюКонстантыВСписке();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюСсылки(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		ДобавитьРегистрациюВСписокСсылок();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюУдаленияОбъекта(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		ДобавитьРегистрациюУдаленияОбъектаВСписокСсылок();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюСсылки(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		УдалитьРегистрациюИзСпискаСсылок();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюСсылкиПодбор(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		ДобавитьРегистрациюВСписокСсылок(Истина);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюСсылкиОтбор(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		ДобавитьРегистрациюВСписокОтбор();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюСсылкиОтбор(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		УдалитьРегистрациюВСпискеОтбор();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюАвтоОбъектов(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		ДобавитьРегистрациюВыделенныхОбъектов(Ложь);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюАвтоОбъектов(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		УдалитьРегистрациюВыделенныхОбъектов(Ложь);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюВсехОбъектов(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		ДобавитьРегистрациюВыделенныхОбъектов();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюВсехОбъектов(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		УдалитьРегистрациюВыделенныхОбъектов();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюНабораЗаписейОтбор(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		ДобавитьРегистрациюВНаборЗаписейОтбор();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюНабораЗаписей(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		УдалитьРегистрациюВНабореЗаписей();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюНабораЗаписейОтбор(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		УдалитьРегистрациюВНабореЗаписейОтбор();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьВсеДанные(Команда)
	ЗаполнитьКоличествоРегистрацийВДереве();
	ОбновитьСодержимоеСтраницы();
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюРезультатаЗапроса(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		ОперацияСРезультатамиЗапроса(Истина);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюРезультатаЗапроса(Команда)
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		ОперацияСРезультатамиЗапроса(Ложь);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьФормуНастроек(Команда)
	ОткрытьФормуНастроекОбработки();
КонецПроцедуры

&НаКлиенте
Процедура РедактироватьНомерСообщенияОбъекта(Команда)
	
	Если Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница = Элементы.СтраницаКонстанты Тогда
		РедактироватьНомерСообщенияКонстанты();
		
	ИначеЕсли Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница = Элементы.СтраницаСписокСсылок Тогда
		РедактироватьНомерСообщенияСсылки();
		
	ИначеЕсли Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница = Элементы.СтраницаНаборЗаписей Тогда
		РедактироватьНомерСообщенияСписокНаборов()
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗарегистрироватьИОМИПредопределенные(Команда)
	
	ЗаголовокВопроса = НСтр("ru = 'Подтверждение'");
	ТекстВопроса     = СтрЗаменить( 
		НСтр("ru = 'Зарегистрировать данные для восстановления подчиненного узла РИБ
		     |на узле ""%1""?'"),
		"%1", УзелОбменаСсылка);
	
	Оповещение = Новый ОписаниеОповещения("ЗарегистрироватьИОМЗавершение", ЭтотОбъект);
	ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , , ЗаголовокВопроса);
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаКлиенте
Процедура ПодтвердитьЗакрытиеФормыЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
	
	Если Не РезультатВопроса = КодВозвратаДиалога.Да Тогда
		Возврат;
	КонецЕсли;
	
	ЗакрытьФормуБезусловно = Истина;
	Закрыть();
	
КонецПроцедуры

&НаСервере
Процедура УстановитьУсловноеОформление()

	УсловноеОформление.Элементы.Очистить();

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СписокСсылокНомерСообщения.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокСсылок.НеВыгружалось");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.СветлоСерый);
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = 'Не выгружалось'"));

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СписокКонстантНомерСообщения.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокКонстант.НеВыгружалось");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.СветлоСерый);
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = 'Не выгружалось'"));

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СписокНаборовЗаписейНомерСообщения.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокНаборовЗаписей.НеВыгружалось");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.СветлоСерый);
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = 'Не выгружалось'"));

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ДеревоМетаданныхКоличествоИзмененийСтрокой.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДеревоМетаданных.КоличествоИзменений");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = 0;

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.ТемноСерый);
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = 'Нет изменений'"));
	
КонецПроцедуры
//

// Обработчик оповещения продолжения диалога.
&НаКлиенте 
Процедура ЗарегистрироватьИОМЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
	
	Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда
		Возврат;
	КонецЕсли;
	
	СообщитьОРезультатахРегистрации(ЗарегистрироватьИОМИПредопределенныеНаСервере() );
		
	ЗаполнитьКоличествоРегистрацийВДереве();
	ОбновитьСодержимоеСтраницы();
КонецПроцедуры

// Обработчик оповещения продолжения диалога.
&НаКлиенте 
Процедура ОбработкаВыбораЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
	Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда
		Возврат
	КонецЕсли;
	ВыбранноеЗначение = ДополнительныеПараметры.ВыбранноеЗначение;
	Если Объект.ДоступнаРегистрацияАсинхронно Тогда
		ПараметрыФоновогоЗадания = ПодготовитьПараметрыИзмененияРегистрации(ВыбранноеЗначение.ДействиеВыбора, 
		ДополнительныеПараметры.Свойство("БезУчетаАвторегистрации") И ДополнительныеПараметры.БезУчетаАвторегистрации,
		Неопределено);
		ПараметрыФоновогоЗадания.Вставить("ДанныеАдрес", ВыбранноеЗначение.ДанныеВыбора);
		ФоновоеЗаданиеЗапуститьНаКлиенте(ПараметрыФоновогоЗадания);
	Иначе
		СообщитьОРезультатахРегистрации(ИзменитьРегистрациюРезультатаЗапросаСервер(ВыбранноеЗначение.ДействиеВыбора, ВыбранноеЗначение.ДанныеВыбора));
		
		ЗаполнитьКоличествоРегистрацийВДереве();
		ОбновитьСодержимоеСтраницы();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура РедактироватьНомерСообщенияКонстанты()
	ТекДанные = Элементы.СписокКонстант.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Оповещение = Новый ОписаниеОповещения("РедактироватьНомерСообщенияКонстантыЗавершение", ЭтотОбъект, Новый Структура);
	Оповещение.ДополнительныеПараметры.Вставить("МетаПолноеИмя", ТекДанные.МетаПолноеИмя);
	
	НомерСообщения = ТекДанные.НомерСообщения;
	Подсказка = НСтр("ru = 'Номер отправленного'"); 
	
	ПоказатьВводЧисла(Оповещение, НомерСообщения, Подсказка);
КонецПроцедуры

// Обработчик оповещения продолжения диалога.
&НаКлиенте
Процедура РедактироватьНомерСообщенияКонстантыЗавершение(Знач НомерСообщения, Знач ДополнительныеПараметры) Экспорт
	Если НомерСообщения = Неопределено Тогда
		// Отказ от ввода
		Возврат;
	КонецЕсли;
	
	СообщитьОРезультатахРегистрации(ИзменитьНомерСообщенияНаСервере(НомерСообщения, ДополнительныеПараметры.МетаПолноеИмя));
		
	Элементы.СписокКонстант.Обновить();
	ЗаполнитьКоличествоРегистрацийВДереве();
КонецПроцедуры

// Параметры:
//   Ссылка - ПланОбменаСсылка
//
// Возвращаемое значение:
//   Структура - дополнительные параметры:
//     * Ссылка - ПланОбменаСсылка
//
&НаКлиенте
Функция ДополнительныеПараметрыРедактированияНомераСообщения(Ссылка)
	Возврат Новый Структура("Ссылка", Ссылка);
КонецФункции

&НаКлиенте
Процедура РедактироватьНомерСообщенияСсылки()
	ТекДанные = ТекущиеДанныеСпискаСсылок();
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Оповещение = Новый ОписаниеОповещения(
		"РедактироватьНомерСообщенияСсылкиЗавершение",
		ЭтотОбъект,
		ДополнительныеПараметрыРедактированияНомераСообщения(ТекДанные.Ссылка));
	
	НомерСообщения = ТекДанные.НомерСообщения;
	Подсказка = НСтр("ru = 'Номер отправленного'"); 
	
	ПоказатьВводЧисла(Оповещение, НомерСообщения, Подсказка);
КонецПроцедуры

// Обработчик оповещения продолжения диалога.
//
// Параметры:
//   НомерСообщения - Число
//   ДополнительныеПараметры - см. ДополнительныеПараметрыРедактированияНомераСообщения
//
&НаКлиенте
Процедура РедактироватьНомерСообщенияСсылкиЗавершение(Знач НомерСообщения, Знач ДополнительныеПараметры) Экспорт
	Если НомерСообщения = Неопределено Тогда
		// Отказ от ввода
		Возврат;
	КонецЕсли;
	
	СообщитьОРезультатахРегистрации(ИзменитьНомерСообщенияНаСервере(НомерСообщения, ДополнительныеПараметры.Ссылка));
		
	Элементы.СписокСсылок.Обновить();
	ЗаполнитьКоличествоРегистрацийВДереве();
КонецПроцедуры

&НаКлиенте
Процедура РедактироватьНомерСообщенияСписокНаборов()
	ТекДанные = Элементы.СписокНаборовЗаписей.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Оповещение = Новый ОписаниеОповещения("РедактироватьНомерСообщенияСписокНаборовЗавершение", ЭтотОбъект, Новый Структура);
	
	ДанныеСтроки = Новый Структура;
	ИменаКлючей = МассивИменКлючейНабораЗаписей(СписокНаборовЗаписейИмяТаблицы);
	Для Каждого Имя Из ИменаКлючей Цикл
		Если ТекДанные.Свойство("СписокНаборовЗаписей" + Имя) Тогда
			ДанныеСтроки.Вставить(Имя, ТекДанные["СписокНаборовЗаписей" + Имя]);
		КонецЕсли;
	КонецЦикла;
	
	Оповещение.ДополнительныеПараметры.Вставить("ДанныеСтроки", ДанныеСтроки);
	
	НомерСообщения = ТекДанные.НомерСообщения;
	Подсказка = НСтр("ru = 'Номер отправленного'"); 
	
	ПоказатьВводЧисла(Оповещение, НомерСообщения, Подсказка);
КонецПроцедуры

// Обработчик оповещения продолжения диалога.
&НаКлиенте
Процедура РедактироватьНомерСообщенияСписокНаборовЗавершение(Знач НомерСообщения, Знач ДополнительныеПараметры) Экспорт
	Если НомерСообщения = Неопределено Тогда
		// Отказ от ввода
		Возврат;
	КонецЕсли;
	
	СообщитьОРезультатахРегистрации(ИзменитьНомерСообщенияНаСервере(
		НомерСообщения, ДополнительныеПараметры.ДанныеСтроки, СписокНаборовЗаписейИмяТаблицы));
	
	Элементы.СписокНаборовЗаписей.Обновить();
	ЗаполнитьКоличествоРегистрацийВДереве();
КонецПроцедуры

&НаКлиенте
Процедура НастроитьРедактированиеИзменений()
	
	НастроитьРедактированиеИзмененийСервер(ТекущаяСтрокаМетаданных);
	
	ТекущаяСтраницаСписка = Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница;
	Если ТекущаяСтраницаСписка <> Элементы.СтраницаКонстанты
		И ТекущаяСтраницаСписка <> Элементы.СтраницаСписокСсылок
		И ТекущаяСтраницаСписка <> Элементы.СтраницаНаборЗаписей Тогда
		
		Элементы.ПоказатьРезультатВыгрузки.Доступность = Ложь;
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура РазвернутьДеревоМетаданных()
	Для Каждого Строка Из ДеревоМетаданных.ПолучитьЭлементы() Цикл
		Элементы.ДеревоМетаданных.Развернуть( Строка.ПолучитьИдентификатор() );
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура УстановитьЗаголовокНомеровСообщений()
	
	Текст = НСтр("ru = '№ отправленного %1, № принятого %2'");
	
	Данные = ПрочитатьНомераСообщений();
	Текст = СтрЗаменить(Текст, "%1", Формат(Данные.НомерОтправленного, "ЧДЦ=0; ЧН="));
	Текст = СтрЗаменить(Текст, "%2", Формат(Данные.НомерПринятого, "ЧДЦ=0; ЧН="));
	
	Элементы.ФормаРедактироватьНомераСообщений.Заголовок = Текст;
КонецПроцедуры	

&НаКлиенте
Процедура ОбработкаВыбораУзлаОбмена()
	ОбработкаВыбораУзлаОбменаСервер();
КонецПроцедуры

&НаСервере
Процедура ОбработкаВыбораУзлаОбменаСервер()
	
	// Изменяем номера узлов в гиперссылке по редактированию.
	УстановитьЗаголовокНомеровСообщений();
	
	// Обновляем дерево метаданных.
	ПрочитатьДеревоМетаданных();
	ЗаполнитьКоличествоРегистрацийВДереве();
	
	// Обновляем активную страницу.
	Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница = Элементы.СтраницаПустая;
	
	// Обновляем команды, зависящие от узла.
	
	МетаПланОбменаУзла = УзелОбменаСсылка.Метаданные();
	
	ЗаполнитьДополнительнуюИнформацию();
	
	Если Объект.ДоступнаРаботаРИБ                             // Доступна работа с ИОМ по версии БСП.
		И (ПланыОбмена.ГлавныйУзел() = Неопределено)          // Текущая база - главный узел.
		И МетаПланОбменаУзла.РаспределеннаяИнформационнаяБаза Тогда // Текущий узел - РИБ
		Элементы.ФормаЗарегистрироватьИОМИПредопределенные.Видимость = Истина;
	Иначе
		Элементы.ФормаЗарегистрироватьИОМИПредопределенные.Видимость = Ложь;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СообщитьОРезультатахРегистрации(Результаты)
	Команда = Результаты.Команда;
	Если ТипЗнч(Команда) = Тип("Булево") Тогда
		Если Команда Тогда
			ЗаголовокПредупреждения = НСтр("ru = 'Регистрация изменений:'");
			ТекстПредупреждения = НСтр("ru = 'Зарегистрировано %1 изменений из %2
			                           |на узле ""%0""'");
		Иначе
			ЗаголовокПредупреждения = НСтр("ru = 'Отмена регистрации:'");
			ТекстПредупреждения = НСтр("ru = 'Отменена регистрация %1 изменений 
			                           |на узле ""%0"".'");
		КонецЕсли;
	Иначе
		ЗаголовокПредупреждения = НСтр("ru = 'Изменение номера сообщения:'");
		ТекстПредупреждения = НСтр("ru = 'Номер сообщения изменен на %3
		                           |у %1 объекта(ов)'");
	КонецЕсли;
	
	ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, "%0", УзелОбменаСсылка);
	ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, "%1", Формат(Результаты.Успешно, "ЧН=0;"));
	ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, "%2", Формат(Результаты.Всего, "ЧН=0;"));
	ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, "%3", Команда);
	
	Предупреждением = Результаты.Всего <> Результаты.Успешно;
	Если Предупреждением Тогда
		ПоказатьПредупреждение(, ТекстПредупреждения, , ЗаголовокПредупреждения);
	Иначе
		ПоказатьОповещениеПользователя(ЗаголовокПредупреждения,
			ПолучитьНавигационнуюСсылку(УзелОбменаСсылка),
			ТекстПредупреждения,
			Элементы.СкрытаяКартинкаИнформация32.Картинка);
	КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ПолучитьФормуВыбораРезультатаЗапроса()
	
	ТекущийОбъект = ЭтотОбъект();
	ТекущийОбъект.ПрочитатьНастройки();
	ЭтотОбъект(ТекущийОбъект);
	
	Проверка = ТекущийОбъект.ПроверитьКорректностьНастроек();
	ЭтотОбъект(ТекущийОбъект);
	
	Если Проверка.НастройкаАдресВнешнейОбработкиЗапросов <> Неопределено Тогда
		Возврат Неопределено;
		
	ИначеЕсли ПустаяСтрока(ТекущийОбъект.НастройкаАдресВнешнейОбработкиЗапросов) Тогда
		Возврат Неопределено;
		
	ИначеЕсли НРег(Прав(СокрЛП(ТекущийОбъект.НастройкаАдресВнешнейОбработкиЗапросов), 4)) = ".epf" Тогда
		Возврат Неопределено;
		
	Иначе
		Обработка = Обработки[ТекущийОбъект.НастройкаАдресВнешнейОбработкиЗапросов].Создать();
		ИдентификаторФормы = ".Форма";
		
	КонецЕсли;
	
	Возврат Обработка.Метаданные().ПолноеИмя() + ИдентификаторФормы;
КонецФункции

&НаКлиенте
Процедура ДобавитьРегистрациюКонстантыВСписке()
	ТекИмяФормы = ИмяЭтойФормы + "Форма.ВыборКонстанты";
	ТекПараметры = Новый Структура();
	ТекПараметры.Вставить("УзелОбмена",УзелОбменаСсылка);
	ТекПараметры.Вставить("МассивИменМетаданных",СтруктураИменМетаданных.Константы);
	ТекПараметры.Вставить("МассивПредставлений",СтруктураПредставленийМетаданных.Константы);
	ТекПараметры.Вставить("МассивАвторегистрации",СтруктураАвторегистрацииМетаданных.Константы);
	ОткрытьФорму(ТекИмяФормы, ТекПараметры, Элементы.СписокКонстант);
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюКонстантыВСписке()
	
	Элемент = Элементы.СписокКонстант;
	
	СписокПредставлений = Новый Массив;
	СписокИмен          = Новый Массив;
	Для Каждого Строка Из Элемент.ВыделенныеСтроки Цикл
		Данные = Элемент.ДанныеСтроки(Строка);
		СписокПредставлений.Добавить(Данные.Наименование);
		СписокИмен.Добавить(Данные.МетаПолноеИмя);
	КонецЦикла;
	
	Количество = СписокИмен.Количество();
	Если Количество = 0 Тогда
		Возврат;
	ИначеЕсли Количество = 1 Тогда
		Текст = НСтр("ru = 'Отменить регистрацию ""%2""
		                 |на узле ""%1""?'"); 
	Иначе
		Текст = НСтр("ru = 'Отменить регистрацию выбранных констант
		                 |на узле ""%1""?'"); 
	КонецЕсли;
	Текст = СтрЗаменить(Текст, "%1", УзелОбменаСсылка);
	Текст = СтрЗаменить(Текст, "%2", СписокПредставлений[0]);
	
	ЗаголовокВопроса = НСтр("ru = 'Подтверждение'");
	
	Оповещение = Новый ОписаниеОповещения("УдалитьРегистрациюКонстантыВСпискеЗавершение", ЭтотОбъект, Новый Структура);
	Оповещение.ДополнительныеПараметры.Вставить("СписокИмен", СписокИмен);
	
	ПоказатьВопрос(Оповещение, Текст, РежимДиалогаВопрос.ДаНет, , ,ЗаголовокВопроса);
КонецПроцедуры

// Обработчик оповещения продолжения диалога.
&НаКлиенте
Процедура УдалитьРегистрациюКонстантыВСпискеЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
	Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда
		Возврат;
	КонецЕсли;
		
	СообщитьОРезультатахРегистрации(УдалитьРегистрациюНаСервере(Истина, ДополнительныеПараметры.СписокИмен));
		
	Элементы.СписокКонстант.Обновить();
	ЗаполнитьКоличествоРегистрацийВДереве();
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюВСписокСсылок(ЭтоПодбор = Ложь)
	ТекИмяФормы = СписокСсылокИмяТаблицы + ".ФормаВыбора";
	ТекПараметры = Новый Структура();
	ТекПараметры.Вставить("РежимВыбора", Истина);
	ТекПараметры.Вставить("МножественныйВыбор", Истина);
	ТекПараметры.Вставить("ЗакрыватьПриВыборе", ЭтоПодбор);
	ТекПараметры.Вставить("ВыборГруппИЭлементов", ИспользованиеГруппИЭлементов.ГруппыИЭлементы);

	ОткрытьФорму(ТекИмяФормы, ТекПараметры, Элементы.СписокСсылок);
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюУдаленияОбъектаВСписокСсылок()
	Ссылка = СсылкаДляУдаленияОбъекта();
	ОбработкаВыбораДанных(Элементы.СписокСсылок, Ссылка);
КонецПроцедуры

&НаСервере
Функция СсылкаДляУдаленияОбъекта(Знач УникальныйИдентификатор = Неопределено)
	Описание = ЭтотОбъект().ХарактеристикиПоМетаданным(СписокСсылокИмяТаблицы);
	Если УникальныйИдентификатор = Неопределено Тогда
		Возврат Описание.Менеджер.ПолучитьСсылку();
	КонецЕсли;
	Возврат Описание.Менеджер.ПолучитьСсылку(УникальныйИдентификатор);
КонецФункции

&НаКлиенте 
Процедура ДобавитьРегистрациюВСписокОтбор()
	ТекИмяФормы = ИмяЭтойФормы + "Форма.ВыборОбъектовОтбором";
	ТекПараметры = Новый Структура("ДействиеВыбора, ИмяТаблицы", 
		Истина,
		СписокСсылокИмяТаблицы);
	ОткрытьФорму(ТекИмяФормы, ТекПараметры, Элементы.СписокСсылок);
КонецПроцедуры

&НаКлиенте 
Процедура УдалитьРегистрациюВСпискеОтбор()
	ТекИмяФормы = ИмяЭтойФормы + "Форма.ВыборОбъектовОтбором";
	ТекПараметры = Новый Структура("ДействиеВыбора, ИмяТаблицы", 
		Ложь,
		СписокСсылокИмяТаблицы);
	ОткрытьФорму(ТекИмяФормы, ТекПараметры, Элементы.СписокСсылок);
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюИзСпискаСсылок()
	
	Элемент = Элементы.СписокСсылок;
	
	СписокУдаления = Новый Массив;
	Для Каждого Строка Из Элемент.ВыделенныеСтроки Цикл
		Данные = Элемент.ДанныеСтроки(Строка); // см. ТекущиеДанныеСпискаСсылок
		СписокУдаления.Добавить(Данные.Ссылка);
	КонецЦикла;
	
	Количество = СписокУдаления.Количество();
	Если Количество = 0 Тогда
		Возврат;
	ИначеЕсли Количество = 1 Тогда
		Текст = НСтр("ru = 'Отменить регистрацию ""%2""
		                 |на узле ""%1""?'"); 
	Иначе
		Текст = НСтр("ru = 'Отменить регистрацию выбранных объектов
		                 |на узле ""%1""?'"); 
	КонецЕсли;
	Текст = СтрЗаменить(Текст, "%1", УзелОбменаСсылка);
	Текст = СтрЗаменить(Текст, "%2", СписокУдаления[0]);
	
	ЗаголовокВопроса = НСтр("ru = 'Подтверждение'");
	
	Оповещение = Новый ОписаниеОповещения("УдалитьРегистрациюИзСпискаСсылокЗавершение", ЭтотОбъект, Новый Структура);
	Оповещение.ДополнительныеПараметры.Вставить("СписокУдаления", СписокУдаления);
	
	ПоказатьВопрос(Оповещение, Текст, РежимДиалогаВопрос.ДаНет, , , ЗаголовокВопроса);
КонецПроцедуры

// Обработчик оповещения продолжения диалога.
&НаКлиенте 
Процедура УдалитьРегистрациюИзСпискаСсылокЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
	Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда
		Возврат;
	КонецЕсли;
	
	СообщитьОРезультатахРегистрации(УдалитьРегистрациюНаСервере(Истина, ДополнительныеПараметры.СписокУдаления));
		
	Элементы.СписокСсылок.Обновить();
	ЗаполнитьКоличествоРегистрацийВДереве();
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюВНаборЗаписейОтбор()
	ТекИмяФормы = ИмяЭтойФормы + "Форма.ВыборОбъектовОтбором";
	ТекПараметры = Новый Структура("ДействиеВыбора, ИмяТаблицы", 
		Истина,
		СписокНаборовЗаписейИмяТаблицы);
	ОткрытьФорму(ТекИмяФормы, ТекПараметры, Элементы.СписокНаборовЗаписей);
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюВНабореЗаписей()
	
	СтруктураДанных = "";
	ИменаКлючей = МассивИменКлючейНабораЗаписей(СписокНаборовЗаписейИмяТаблицы);
	Для Каждого Имя Из ИменаКлючей Цикл
		СтруктураДанных = СтруктураДанных +  "," + Имя;
	КонецЦикла;
	СтруктураДанных = Сред(СтруктураДанных, 2);
	
	Данные = Новый Массив;
	Элемент = Элементы.СписокНаборовЗаписей;
	Для Каждого Строка Из Элемент.ВыделенныеСтроки Цикл
		ТекДанные = Элемент.ДанныеСтроки(Строка);
		ДанныеСтроки = Новый Структура;
		Для Каждого Имя Из ИменаКлючей Цикл
			ИмяКолонки = "СписокНаборовЗаписей" + Имя;
			Если ТекДанные.Свойство(ИмяКолонки) Тогда 
				ДанныеСтроки.Вставить(Имя, ТекДанные[ИмяКолонки]);
			КонецЕсли;
		КонецЦикла;
		Данные.Добавить(ДанныеСтроки);
	КонецЦикла;
	
	Если Данные.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	Выбор = Новый Структура();
	Выбор.Вставить("ИмяТаблицы",СписокНаборовЗаписейИмяТаблицы);
	Выбор.Вставить("ДанныеВыбора",Данные);
	Выбор.Вставить("ДействиеВыбора",Ложь);
	Выбор.Вставить("СтруктураПолей",СтруктураДанных);
	ОбработкаВыбораДанных(Элементы.СписокНаборовЗаписей, Выбор);
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюВНабореЗаписейОтбор()
	ТекИмяФормы = ИмяЭтойФормы + "Форма.ВыборОбъектовОтбором";
	ТекПараметры = Новый Структура("ДействиеВыбора, ИмяТаблицы", 
		Ложь,
		СписокНаборовЗаписейИмяТаблицы);
	ОткрытьФорму(ТекИмяФормы, ТекПараметры, Элементы.СписокНаборовЗаписей);
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегистрациюВыделенныхОбъектов(БезУчетаАвторегистрации = Истина)
	
	Данные = ПолучитьВыбранныеИменаМетаданных(БезУчетаАвторегистрации);
	Количество = Данные.МетаИмена.Количество();
	Если Количество = 0 Тогда
		// Текущая строка
		Данные = ПолучитьИменаМетаданныхТекущейСтроки(БезУчетаАвторегистрации);
	КонецЕсли;
	
	Текст = НСтр("ru = 'Зарегистрировать %1 для выгрузки на узле ""%2""?
	                 |
	                 |Изменение регистрации большого количества объектов может занять продолжительное время.'");
					 
	Текст = СтрЗаменить(Текст, "%1", Данные.Описание);
	Текст = СтрЗаменить(Текст, "%2", УзелОбменаСсылка);
	
	ЗаголовокВопроса = НСтр("ru = 'Подтверждение'");
	
	Оповещение = Новый ОписаниеОповещения("ДобавитьРегистрациюВыделенныхОбъектовЗавершение", ЭтотОбъект, Новый Структура);
	Оповещение.ДополнительныеПараметры.Вставить("МетаИмена", Данные.МетаИмена);
	Оповещение.ДополнительныеПараметры.Вставить("БезУчетаАвторегистрации", БезУчетаАвторегистрации);
	
	ПоказатьВопрос(Оповещение, Текст, РежимДиалогаВопрос.ДаНет, , , ЗаголовокВопроса);
КонецПроцедуры

// Обработчик оповещения продолжения диалога.
&НаКлиенте 
Процедура ДобавитьРегистрациюВыделенныхОбъектовЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
	Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда
		Возврат;
	КонецЕсли;
	Если Объект.ДоступнаРегистрацияАсинхронно Тогда
		ПараметрыФоновогоЗадания = ПодготовитьПараметрыИзмененияРегистрации(Истина, ДополнительныеПараметры.БезУчетаАвторегистрации, 
										ДополнительныеПараметры.МетаИмена);
		ФоновоеЗаданиеЗапуститьНаКлиенте(ПараметрыФоновогоЗадания);
	Иначе
		Результат = ДобавитьРегистрациюНаСервере(ДополнительныеПараметры.БезУчетаАвторегистрации, 
			ДополнительныеПараметры.МетаИмена);
		
		ЗаполнитьКоличествоРегистрацийВДереве();
		ОбновитьСодержимоеСтраницы();
		СообщитьОРезультатахРегистрации(Результат);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегистрациюВыделенныхОбъектов(БезУчетаАвторегистрации = Истина)
	
	Данные = ПолучитьВыбранныеИменаМетаданных(БезУчетаАвторегистрации);
	Количество = Данные.МетаИмена.Количество();
	Если Количество = 0 Тогда
		Данные = ПолучитьИменаМетаданныхТекущейСтроки(БезУчетаАвторегистрации);
	КонецЕсли;
	
	Текст = НСтр("ru = 'Отменить регистрацию %1 для выгрузки на узле ""%2""?
	                 |
	                 |Изменение регистрации большого количества объектов может занять продолжительное время.'");
	
	ЗаголовокВопроса = НСтр("ru = 'Подтверждение'");
	
	Текст = СтрЗаменить(Текст, "%1", Данные.Описание);
	Текст = СтрЗаменить(Текст, "%2", УзелОбменаСсылка);
	
	Оповещение = Новый ОписаниеОповещения("УдалитьРегистрациюВыделенныхОбъектовЗавершение", ЭтотОбъект, Новый Структура);
	Оповещение.ДополнительныеПараметры.Вставить("МетаИмена", Данные.МетаИмена);
	Оповещение.ДополнительныеПараметры.Вставить("БезУчетаАвторегистрации", БезУчетаАвторегистрации);
	
	ПоказатьВопрос(Оповещение, Текст, РежимДиалогаВопрос.ДаНет, , , ЗаголовокВопроса);
КонецПроцедуры

// Обработчик оповещения продолжения диалога.
&НаКлиенте
Процедура УдалитьРегистрациюВыделенныхОбъектовЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
	Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда
		Возврат;
	КонецЕсли;
	
	Если Объект.ДоступнаРегистрацияАсинхронно Тогда
		ПараметрыФоновогоЗадания = ПодготовитьПараметрыИзмененияРегистрации(Ложь, ДополнительныеПараметры.БезУчетаАвторегистрации, 
										ДополнительныеПараметры.МетаИмена);
		ФоновоеЗаданиеЗапуститьНаКлиенте(ПараметрыФоновогоЗадания);
	Иначе
		СообщитьОРезультатахРегистрации(УдалитьРегистрациюНаСервере(ДополнительныеПараметры.БезУчетаАвторегистрации, 
				ДополнительныеПараметры.МетаИмена));
			
		ЗаполнитьКоличествоРегистрацийВДереве();
		ОбновитьСодержимоеСтраницы();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ФоновоеЗаданиеЗапуститьНаКлиенте(ПараметрыФоновогоЗадания)
	ДлительнаяОперацияЗапущена = Истина;
	ВидДлительнойОперации = ?(ПараметрыФоновогоЗадания.Команда, Истина, Ложь);
	ПодключитьОбработчикОжидания("СтраницаДлительнойОперации", 0.1, Истина);
	Результат = ФоновоеЗаданиеЗапуститьНаСервере(ПараметрыФоновогоЗадания);
	Если Результат = Неопределено Тогда
		ДлительнаяОперацияЗапущена = Ложь;
		ТекстПредупреждения = НСтр("ru = 'При запуске фонового задания с целью изменения регистрации произошла ошибка.'");
		ПоказатьПредупреждение(, ТекстПредупреждения);
		Возврат;
	КонецЕсли;
	ОбщийМодульДлительныеОперацииКлиент = ОбщийМодульДлительныеОперацииКлиент();
	Если Результат.Статус = "Выполняется" Тогда
		ПараметрыОжидания = ОбщийМодульДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
		ПараметрыОжидания.ВыводитьОкноОжидания  = Ложь;
		ПараметрыОжидания.ВыводитьСообщения     = Истина;
		
		ОповещениеОЗавершении = Новый ОписаниеОповещения("ЗавершениеФоновогоЗадания", ЭтотОбъект);
		ОбщийМодульДлительныеОперацииКлиент.ОжидатьЗавершение(Результат, ОповещениеОЗавершении, ПараметрыОжидания);
	Иначе
		ФоновоеЗаданиеРезультатВыполнения = Результат;
		ПодключитьОбработчикОжидания("РезультатВыполненияФоновогоЗадания", 0.1, Истина);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура СтраницаДлительнойОперации()
	Если НЕ ДлительнаяОперацияЗапущена Тогда
		Возврат;
	КонецЕсли;
	Если ВидДлительнойОперации Тогда
		СтатусОперации = НСтр("ru = 'Выполняется регистрация изменений. Пожалуйста, подождите.'");
	Иначе
		СтатусОперации = НСтр("ru = 'Выполняется отмена регистрации изменений. Пожалуйста, подождите.'");
	КонецЕсли;
	Элементы.СтатусДлительнойОперации.Заголовок = СтатусОперации;
	Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.Ожидание;
КонецПроцедуры

&НаКлиенте
Процедура ЗавершениеФоновогоЗадания(Результат, ДополнительныеПараметры) Экспорт
	
	ФоновоеЗаданиеРезультатВыполнения = Результат;
	РезультатВыполненияФоновогоЗадания();
	
КонецПроцедуры

&НаКлиенте
Процедура РезультатВыполненияФоновогоЗадания()
	
	ФоновоеЗаданиеПолучитьРезультатНаСервере();
	ДлительнаяОперацияЗапущена = Ложь;
	
	Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.Основная;
	ТекущийЭлемент = Элементы.ДеревоМетаданных;
	
	Если ЗначениеЗаполнено(СообщениеОбОшибке) Тогда
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = СообщениеОбОшибке;
		Сообщение.Сообщить();
	КонецЕсли;
	
	Если Не ФоновоеЗаданиеРезультатВыполнения = Неопределено Тогда
		Если ФоновоеЗаданиеРезультатВыполнения.Свойство("ДополнительныеДанныеРезультата")
			И ФоновоеЗаданиеРезультатВыполнения.ДополнительныеДанныеРезультата.Свойство("Команда") Тогда
			
			СообщитьОРезультатахРегистрации(ФоновоеЗаданиеРезультатВыполнения.ДополнительныеДанныеРезультата);
			ЗаполнитьКоличествоРегистрацийВДереве();
			ОбновитьСодержимоеСтраницы();
			
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция ФоновоеЗаданиеЗапуститьНаСервере(ПараметрыФоновогоЗадания)
	
	МодульДлительныеОперации = ОбщийМодульДлительныеОперации();
	ПараметрыВыполнения = МодульДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	ПараметрыВыполнения.ДополнительныйРезультат = Ложь;
	
	Если ПараметрыФоновогоЗадания.Свойство("ДанныеАдрес") Тогда
		// Передан адрес хранения данных.
		Результат = ПолучитьИзВременногоХранилища(ПараметрыФоновогоЗадания.ДанныеАдрес);
		Результат= Результат[Результат.ВГраница()];
		Данные = Результат.Выгрузить().ВыгрузитьКолонку("Ссылка");
		ПараметрыФоновогоЗадания.Вставить("Данные", Данные);
	КонецЕсли;
	ИмяПроцедуры = РеквизитФормыВЗначение("Объект").Метаданные().ПолноеИмя() + ".МодульОбъекта.ВыполнитьИзменениеРегистрации";
	Результат = МодульДлительныеОперации.ВыполнитьВФоне(ИмяПроцедуры, ПараметрыФоновогоЗадания, ПараметрыВыполнения);
	ФоновоеЗаданиеИдентификатор  = Результат.ИдентификаторЗадания;
	ФоновоеЗаданиеАдресХранилища = Результат.АдресРезультата;
	
	Возврат Результат;
	
КонецФункции

&НаСервере
Процедура ФоновоеЗаданиеПолучитьРезультатНаСервере()
	
	Если ФоновоеЗаданиеРезультатВыполнения <> Неопределено Тогда
		ФоновоеЗаданиеРезультатВыполнения.Вставить("ДополнительныеДанныеРезультата", Новый Структура);
		СообщениеОбОшибке = "";
		ТиповоеПредставлениеОшибки = НСтр("ru = 'При изменении регистрации произошла ошибка. Подробности см. в журнале регистрации'");
		
		Если ФоновоеЗаданиеРезультатВыполнения.Статус = "Ошибка" Тогда
			СообщениеОбОшибке = ФоновоеЗаданиеРезультатВыполнения.ПодробноеПредставлениеОшибки;
		Иначе
			РезультатВыполненияВФоне = ПолучитьИзВременногоХранилища(ФоновоеЗаданиеАдресХранилища);
			
			Если РезультатВыполненияВФоне = Неопределено Тогда
				СообщениеОбОшибке = ТиповоеПредставлениеОшибки;
			Иначе
				ФоновоеЗаданиеРезультатВыполнения.ДополнительныеДанныеРезультата = РезультатВыполненияВФоне;
				УдалитьИзВременногоХранилища(ФоновоеЗаданиеАдресХранилища);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	ФоновоеЗаданиеАдресХранилища = Неопределено;
	ФоновоеЗаданиеИдентификатор  = Неопределено;
	
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ЗавершитьВыполнениеДлительнойОперации(ИдентификаторЗадания)
	МодульДлительныеОперации = ОбщийМодульДлительныеОперации();
	МодульДлительныеОперации.ОтменитьВыполнениеЗадания(ИдентификаторЗадания);
КонецПроцедуры

// Возвращает ссылку на общий модуль "ДлительныеОперацииКлиент".
//
// Возвращаемое значение:
//  ОбщийМодуль - общий модуль "ДлительныеОперацииКлиент".
//
&НаКлиенте
Функция ОбщийМодульДлительныеОперацииКлиент()
	
	// Вызов ВычислитьВБезопасномРежиме не требуется, т.к. для вычисления передается строковый литерал.
	Модуль = Вычислить("ДлительныеОперацииКлиент");
	
	Если ТипЗнч(Модуль) <> Тип("ОбщийМодуль") Тогда
		ВызватьИсключение НСтр("ru = 'Общий модуль ""ДлительныеОперацииКлиент"" не найден.'");
	КонецЕсли;
	
	Возврат Модуль;
	
КонецФункции

// Возвращает ссылку на общий модуль "ДлительныеОперации".
//
// Возвращаемое значение:
//  ОбщийМодуль - общий модуль "ДлительныеОперации".
//
&НаСервереБезКонтекста
Функция ОбщийМодульДлительныеОперации()

	Если Метаданные.ОбщиеМодули.Найти("ДлительныеОперации") <> Неопределено Тогда
		// Вызов ВычислитьВБезопасномРежиме не требуется, т.к. для вычисления передается строковый литерал.
		Модуль = Вычислить("ДлительныеОперации");
	Иначе
		Модуль = Неопределено;
	КонецЕсли;
	
	Если ТипЗнч(Модуль) <> Тип("ОбщийМодуль") Тогда
		ВызватьИсключение НСтр("ru = 'Общий модуль ""ДлительныеОперации"" не найден.'");
	КонецЕсли;
	
	Возврат Модуль;
	
КонецФункции

// Возвращаемое значение:
//   Структура - дополнительные параметры:
//     * Действие - Булево
//     * ТаблицаФормы - ТаблицаФормы
//     * Данные - Произвольный
//     * ИмяТаблицы - Строка
//     * Ссылка - ЛюбаяСсылка
//
&НаКлиенте
Функция ДополнительныеПараметрыОбработкиВыбораДанных()
	
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("Действие");
	ДополнительныеПараметры.Вставить("ТаблицаФормы");
	ДополнительныеПараметры.Вставить("Данные");
	ДополнительныеПараметры.Вставить("ИмяТаблицы");
	ДополнительныеПараметры.Вставить("Ссылка");
	
	Возврат ДополнительныеПараметры;
	
КонецФункции

&НаКлиенте
Процедура ОбработкаВыбораДанных(ТаблицаФормы, ВыбранноеЗначение)
	
	Ссылка = Неопределено;
	Тип    = ТипЗнч(ВыбранноеЗначение);
	
	Если Тип = Тип("Структура") Тогда
		Если Не (ВыбранноеЗначение.Свойство("ИмяТаблицы")
			И ВыбранноеЗначение.Свойство("ДействиеВыбора")
			И ВыбранноеЗначение.Свойство("ДанныеВыбора")) Тогда
			// Ожидаем структуру в заданном формате.
			Возврат;
		КонецЕсли;
		ИмяТаблицы = ВыбранноеЗначение.ИмяТаблицы;
		Действие   = ВыбранноеЗначение.ДействиеВыбора;
		Данные     = ВыбранноеЗначение.ДанныеВыбора;
	Иначе
		ИмяТаблицы = Неопределено;
		Действие = Истина;
		Если Тип = Тип("Массив") Тогда
			Данные = ВыбранноеЗначение;
		Иначе		
			Данные = Новый Массив;
			Данные.Добавить(ВыбранноеЗначение);
		КонецЕсли;
		
		Если Данные.Количество() = 1 Тогда
			Ссылка = Данные[0];
		КонецЕсли;
	КонецЕсли;
	
	Если Действие Тогда
		Результат = ДобавитьРегистрациюНаСервере(Истина, Данные, ИмяТаблицы);
		
		ТаблицаФормы.Обновить();
		ЗаполнитьКоличествоРегистрацийВДереве();
		СообщитьОРезультатахРегистрации(Результат);
		
		ТаблицаФормы.ТекущаяСтрока = Ссылка;
		Возврат;
	КонецЕсли;
	
	Если Ссылка = Неопределено Тогда
		Текст = НСтр("ru = 'Отменить регистрацию выбранных объектов
		                 |на узле ""%1?'"); 
	Иначе
		Текст = НСтр("ru = 'Отменить регистрацию ""%2""
		                 |на узле ""%1?'"); 
	КонецЕсли;
		
	Текст = СтрЗаменить(Текст, "%1", УзелОбменаСсылка);
	Текст = СтрЗаменить(Текст, "%2", Ссылка);
	
	ЗаголовокВопроса = НСтр("ru = 'Подтверждение'");
		
	ДополнительныеПараметры = ДополнительныеПараметрыОбработкиВыбораДанных();
	ДополнительныеПараметры.Действие     = Действие;
	ДополнительныеПараметры.ТаблицаФормы = ТаблицаФормы;
	ДополнительныеПараметры.Данные       = Данные;
	ДополнительныеПараметры.ИмяТаблицы   = ИмяТаблицы;
	ДополнительныеПараметры.Ссылка       = Ссылка;
	
	Оповещение = Новый ОписаниеОповещения("ОбработкаВыбораДанныхЗавершение", ЭтотОбъект, ДополнительныеПараметры);
	
	ПоказатьВопрос(Оповещение, Текст, РежимДиалогаВопрос.ДаНет, , ,ЗаголовокВопроса);
КонецПроцедуры

// Обработчик оповещения продолжения диалога.
//
// Параметры:
//   РезультатВопроса -КодВозвратаДиалога
//   ДополнительныеПараметры - см. ДополнительныеПараметрыОбработкиВыбораДанных
//
&НаКлиенте
Процедура ОбработкаВыбораДанныхЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
	Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда
		Возврат;
	КонецЕсли;
	Если Объект.ДоступнаРегистрацияАсинхронно Тогда
		ПараметрыФоновогоЗадания = ПодготовитьПараметрыИзмененияРегистрации(Ложь, Истина, ДополнительныеПараметры.Данные, 
										ДополнительныеПараметры.ИмяТаблицы);
		ФоновоеЗаданиеЗапуститьНаКлиенте(ПараметрыФоновогоЗадания);
	Иначе
		Результат = УдалитьРегистрациюНаСервере(Истина, ДополнительныеПараметры.Данные, ДополнительныеПараметры.ИмяТаблицы);
	
		ДополнительныеПараметры.ТаблицаФормы.Обновить();
		ЗаполнитьКоличествоРегистрацийВДереве();
		СообщитьОРезультатахРегистрации(Результат);
	КонецЕсли;
	
	ДополнительныеПараметры.ТаблицаФормы.ТекущаяСтрока = ДополнительныеПараметры.Ссылка;
КонецПроцедуры

&НаСервере
Процедура ОбновитьСодержимоеСтраницы(Страница = Неопределено)
	ТекСтр = ?(Страница = Неопределено, Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница, Страница);
	
	Если ТекСтр = Элементы.СтраницаСписокСсылок Тогда
		Элементы.СписокСсылок.Обновить();
		
	ИначеЕсли ТекСтр = Элементы.СтраницаКонстанты Тогда
		Элементы.СписокКонстант.Обновить();
		
	ИначеЕсли ТекСтр = Элементы.СтраницаНаборЗаписей Тогда
		Элементы.СписокНаборовЗаписей.Обновить();
		
	ИначеЕсли ТекСтр = Элементы.СтраницаПустая Тогда
		Строка = Элементы.ДеревоМетаданных.ТекущаяСтрока;
		Если Строка <> Неопределено Тогда
			Данные = ДеревоМетаданных.НайтиПоИдентификатору(Строка);
			Если Данные <> Неопределено Тогда
				НастроитьПустуюСтраницу(Данные.Наименование, Данные.МетаПолноеИмя);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры	

&НаКлиенте
Функция ПолучитьТекущийОбъектРедактирования()
	
	ТекСтр = Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница;
	
	Если ТекСтр = Элементы.СтраницаСписокСсылок Тогда
		Данные = ТекущиеДанныеСпискаСсылок();
		Если Данные <> Неопределено Тогда
			Возврат Данные.Ссылка; 
		КонецЕсли;
		
	ИначеЕсли ТекСтр = Элементы.СтраницаКонстанты Тогда
		Данные = Элементы.СписокКонстант.ТекущиеДанные;
		Если Данные <> Неопределено Тогда
			Возврат Данные.МетаПолноеИмя; 
		КонецЕсли;
		
	ИначеЕсли ТекСтр = Элементы.СтраницаНаборЗаписей Тогда
		Данные = Элементы.СписокНаборовЗаписей.ТекущиеДанные;
		Если Данные <> Неопределено Тогда
			Результат = Новый Структура;
			Измерения = МассивИменКлючейНабораЗаписей(СписокНаборовЗаписейИмяТаблицы);
			Для Каждого Имя Из Измерения  Цикл
				Если Данные.Свойство("СписокНаборовЗаписей" + Имя) Тогда
					Результат.Вставить(Имя, Данные["СписокНаборовЗаписей" + Имя]);
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
		Возврат Результат;
		
	КонецЕсли;
	
	Возврат Неопределено;
	
КонецФункции

// Возвращаемое значение:
//   ДанныеФормыСтруктура:
//     * Ссылка - ЛюбаяСсылка
//     * НомерСообщения - Число
//     * НеВыгружалось - Булево
//
&НаКлиенте
Функция ТекущиеДанныеСпискаСсылок()
	
	Возврат Элементы.СписокСсылок.ТекущиеДанные;
	
КонецФункции

&НаКлиенте
Процедура ОткрытьФормуНастроекОбработки()
	ТекИмяФормы = ИмяЭтойФормы + "Форма.Настройки";
	ОткрытьФорму(ТекИмяФормы, , ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура ОперацияСРезультатамиЗапроса(КомандаОперации)
	
	ТекИмяФормы = ПолучитьФормуВыбораРезультатаЗапроса();
	Если ТекИмяФормы <> Неопределено Тогда
		// Открываем
		Если КомандаОперации Тогда
			Текст = НСтр("ru = 'Регистрация изменений результата запроса'");
		Иначе
			Текст = НСтр("ru = 'Отмена регистрации изменений результата запроса'");
		КонецЕсли;
		СтруктураПараметров = Новый Структура();
		СтруктураПараметров.Вставить("Заголовок", Текст);
		СтруктураПараметров.Вставить("ДействиеВыбора", КомандаОперации);
		СтруктураПараметров.Вставить("РежимВыбора", Истина);
		СтруктураПараметров.Вставить("ЗакрыватьПриВыборе", Ложь);
		
		Если Не ЗначениеЗаполнено(КлючУникальностиФормыВыбораРезультатаЗапроса) Тогда
			КлючУникальностиФормыВыбораРезультатаЗапроса = Новый УникальныйИдентификатор;
		КонецЕсли;
		
		ОткрытьФорму(ТекИмяФормы, СтруктураПараметров, ЭтотОбъект, КлючУникальностиФормыВыбораРезультатаЗапроса);
		Возврат;
	КонецЕсли;
	
	// Не настроено или что-то поломано, предлагаем выбрать.
	Текст = НСтр("ru = 'В настройках не указана обработка для выполнения запросов.
	                        |Настроить сейчас?'");
	
	ЗаголовокВопроса = НСтр("ru = 'Настройки'");

	Оповещение = Новый ОписаниеОповещения("ОперацияСРезультатамиЗапросаЗавершение", ЭтотОбъект);
	ПоказатьВопрос(Оповещение, Текст, РежимДиалогаВопрос.ДаНет, , , ЗаголовокВопроса);
КонецПроцедуры

// Обработчик оповещения продолжения диалога.
&НаКлиенте 
Процедура ОперацияСРезультатамиЗапросаЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
	Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда
		Возврат;
	КонецЕсли;
	
	ОткрытьФормуНастроекОбработки();
КонецПроцедуры

&НаСервере
Функция ОбработатьКавычкиВСтроке(Строка)
	Возврат СтрЗаменить(Строка, """", """""");
КонецФункции

&НаСервере
Функция ЭтотОбъект(ТекущийОбъект = Неопределено) 
	Если ТекущийОбъект = Неопределено Тогда
		Возврат РеквизитФормыВЗначение("Объект");
	КонецЕсли;
	ЗначениеВРеквизитФормы(ТекущийОбъект, "Объект");
	Возврат Неопределено;
КонецФункции

&НаСервере
Функция ПолучитьИмяФормы(ТекущийОбъект = Неопределено)
	Возврат ЭтотОбъект().ПолучитьИмяФормы(ТекущийОбъект);
КонецФункции

&НаСервере
Процедура ИзменениеПометки(Строка)
	ЭлементДанных = ДеревоМетаданных.НайтиПоИдентификатору(Строка);
	ЭтотОбъект().ИзменениеПометки(ЭлементДанных);
КонецПроцедуры

&НаСервере
Процедура ПрочитатьДеревоМетаданных()
	Данные = ЭтотОбъект().СформироватьСтруктуруМетаданных(УзелОбменаСсылка);
	
	// Удаляем строки, которые нельзя редактировать.
	МетаДерево = Данные.Дерево;
	Для Каждого ЭлементСписка Из Объект.ИменаСкрываемыхМетаданных Цикл
		УдалитьСтрокиДереваЗначенийМетаданных(ЭлементСписка.Значение, МетаДерево.Строки);
	КонецЦикла;
	
	ЗначениеВРеквизитФормы(МетаДерево, "ДеревоМетаданных");
	СтруктураАвторегистрацииМетаданных = Данные.СтруктураАвторегистрации;
	СтруктураПредставленийМетаданных   = Данные.СтруктураПредставлений;
	СтруктураИменМетаданных            = Данные.СтруктураИмен;
КонецПроцедуры

&НаСервере 
Процедура УдалитьСтрокиДереваЗначенийМетаданных(Знач МетаПолноеИмя, СтрокиДерева)
	Если ПустаяСтрока(МетаПолноеИмя) Тогда
		Возврат;
	КонецЕсли;
	
	// В текущем наборе
	Фильтр = Новый Структура("МетаПолноеИмя", МетаПолноеИмя);
	Для Каждого СтрокаУдаления Из СтрокиДерева.НайтиСтроки(Фильтр, Ложь) Цикл
		СтрокиДерева.Удалить(СтрокаУдаления);
		// Если это был последний потомок, то удаляем и родителя.
		Если СтрокиДерева.Количество() = 0 Тогда
			РодительскаяСтрока = СтрокиДерева.Родитель;
			Если РодительскаяСтрока.Родитель <> Неопределено Тогда
				РодительскаяСтрока.Родитель.Строки.Удалить(РодительскаяСтрока);
				// И иерархически вниз уже не ходим.
				Возврат;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	// Удаляем из оставшихся подчиненных.
	Для Каждого СтрокаДерева Из СтрокиДерева Цикл
		УдалитьСтрокиДереваЗначенийМетаданных(МетаПолноеИмя, СтрокаДерева.Строки);
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура ФорматироватьКоличествоИзменений(Строка)
	Строка.КоличествоИзмененийСтрокой = Формат(Строка.КоличествоИзменений, "ЧН=0;") + " / " + Формат(Строка.КоличествоНеВыгруженных, "ЧН=0;");
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьКоличествоРегистрацийВДереве()
	
	Данные = ЭтотОбъект().ПолучитьКоличествоИзменений(СтруктураИменМетаданных, УзелОбменаСсылка);
	
	// Проставляем в дерево
	Фильтр = Новый Структура("МетаПолноеИмя, УзелОбмена", Неопределено, УзелОбменаСсылка);
	Нули   = Новый Структура("КоличествоИзменений, КоличествоВыгруженных, КоличествоНеВыгруженных", 0,0,0);
	
	Для Каждого Корень Из ДеревоМетаданных.ПолучитьЭлементы() Цикл
		СуммаКорень = Новый Структура("КоличествоИзменений, КоличествоВыгруженных, КоличествоНеВыгруженных", 0,0,0);
		
		Для Каждого Группа Из Корень.ПолучитьЭлементы() Цикл
			СуммаГруппа = Новый Структура("КоличествоИзменений, КоличествоВыгруженных, КоличествоНеВыгруженных", 0,0,0);
			
			СписокУзлов = Группа.ПолучитьЭлементы();
			Если СписокУзлов.Количество() = 0 И СтруктураИменМетаданных.Свойство(Группа.МетаПолноеИмя) Тогда
				// Коллекция узлов без узлов, просуммируем руками, авторегистрацию возьмем из структуры.
				Для Каждого МетаИмя Из СтруктураИменМетаданных[Группа.МетаПолноеИмя] Цикл
					Фильтр.МетаПолноеИмя = МетаИмя;
					Найдено = Данные.НайтиСтроки(Фильтр);
					Если Найдено.Количество() > 0 Тогда
						Строка = Найдено[0];
						СуммаГруппа.КоличествоИзменений     = СуммаГруппа.КоличествоИзменений     + Строка.КоличествоИзменений;
						СуммаГруппа.КоличествоВыгруженных   = СуммаГруппа.КоличествоВыгруженных   + Строка.КоличествоВыгруженных;
						СуммаГруппа.КоличествоНеВыгруженных = СуммаГруппа.КоличествоНеВыгруженных + Строка.КоличествоНеВыгруженных;
					КонецЕсли;
				КонецЦикла;
				
			Иначе
				// Считаем по каждому узлу
				Для Каждого Узел Из СписокУзлов Цикл
					Фильтр.МетаПолноеИмя = Узел.МетаПолноеИмя;
					Найдено = Данные.НайтиСтроки(Фильтр);
					Если Найдено.Количество() > 0 Тогда
						Строка = Найдено[0];
						ЗаполнитьЗначенияСвойств(Узел, Строка, "КоличествоИзменений, КоличествоВыгруженных, КоличествоНеВыгруженных");
						СуммаГруппа.КоличествоИзменений     = СуммаГруппа.КоличествоИзменений     + Строка.КоличествоИзменений;
						СуммаГруппа.КоличествоВыгруженных   = СуммаГруппа.КоличествоВыгруженных   + Строка.КоличествоВыгруженных;
						СуммаГруппа.КоличествоНеВыгруженных = СуммаГруппа.КоличествоНеВыгруженных + Строка.КоличествоНеВыгруженных;
					Иначе
						ЗаполнитьЗначенияСвойств(Узел, Нули);
					КонецЕсли;
					
					ФорматироватьКоличествоИзменений(Узел);
				КонецЦикла;
				
			КонецЕсли;
			ЗаполнитьЗначенияСвойств(Группа, СуммаГруппа);
			
			СуммаКорень.КоличествоИзменений     = СуммаКорень.КоличествоИзменений     + Группа.КоличествоИзменений;
			СуммаКорень.КоличествоВыгруженных   = СуммаКорень.КоличествоВыгруженных   + Группа.КоличествоВыгруженных;
			СуммаКорень.КоличествоНеВыгруженных = СуммаКорень.КоличествоНеВыгруженных + Группа.КоличествоНеВыгруженных;
			
			ФорматироватьКоличествоИзменений(Группа);
		КонецЦикла;
		
		ЗаполнитьЗначенияСвойств(Корень, СуммаКорень);
		
		ФорматироватьКоличествоИзменений(Корень);
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Функция ИзменитьРегистрациюРезультатаЗапросаСервер(Команда, Адрес)
	
	Результат = ПолучитьИзВременногоХранилища(Адрес);
	Результат= Результат[Результат.ВГраница()];
	Данные = Результат.Выгрузить().ВыгрузитьКолонку("Ссылка");
	
	Если Команда Тогда
		Возврат ДобавитьРегистрациюНаСервере(Истина, Данные);
	КонецЕсли;
		
	Возврат УдалитьРегистрациюНаСервере(Истина, Данные);
КонецФункции

&НаСервере
Функция КонтрольСсылокДляВыбораЗапросом(Адрес)
	
	Результат = ?(Адрес = Неопределено, Неопределено, ПолучитьИзВременногоХранилища(Адрес));
	Если ТипЗнч(Результат) = Тип("Массив") Тогда 
		Результат = Результат[Результат.ВГраница()];	
		Если Результат.Колонки.Найти("Ссылка") = Неопределено Тогда
			Возврат НСтр("ru = 'В последнем результате запроса отсутствует колонка ""Ссылка""'");
		КонецЕсли;
	Иначе		
		Возврат НСтр("ru = 'Ошибка получения данных результата запроса'");
	КонецЕсли;
	
	Возврат "";
КонецФункции

&НаСервере
Процедура НастроитьРедактированиеИзмененийСервер(ТекущаяСтрока)
	
	Если ТекущаяСтрока = Неопределено Тогда
		
		ИмяТаблицы = "";
		Наименование = ДеревоМетаданных.ПолучитьЭлементы()[0].Наименование;
		ТекущийОбъект = Неопределено;
		
	Иначе
		
		Данные = ДеревоМетаданных.НайтиПоИдентификатору(ТекущаяСтрока);
		Если Данные = Неопределено Тогда
			Возврат;
		КонецЕсли;
		
		ИмяТаблицы   = Данные.МетаПолноеИмя;
		Наименование = Данные.Наименование;
		ТекущийОбъект   = ЭтотОбъект();
		
	КонецЕсли;
	
	Если ПустаяСтрока(ИмяТаблицы) Тогда
		Мета = Неопределено;
	Иначе		
		Мета = ТекущийОбъект.МетаданныеПоПолномуИмени(ИмяТаблицы);
	КонецЕсли;
	
	Если Мета = Неопределено Тогда
		НастроитьПустуюСтраницу(Наименование, ИмяТаблицы);
		НовСтраница = Элементы.СтраницаПустая;
		
	ИначеЕсли Мета = Метаданные.Константы Тогда
		// Все константы системы
		НастроитьСписокКонстант();
		НовСтраница = Элементы.СтраницаКонстанты;
		
	ИначеЕсли ТипЗнч(Мета) = Тип("КоллекцияОбъектовМетаданных") Тогда
		// Все справочники, документы, и т.п.
		НастроитьПустуюСтраницу(Наименование, ИмяТаблицы);
		НовСтраница = Элементы.СтраницаПустая;
		
	ИначеЕсли Метаданные.Константы.Содержит(Мета) Тогда
		// Одиночная константа
		НастроитьСписокКонстант(ИмяТаблицы, Наименование);
		НовСтраница = Элементы.СтраницаКонстанты;
		
	ИначеЕсли Метаданные.Справочники.Содержит(Мета) 
		Или Метаданные.Документы.Содержит(Мета)
		Или Метаданные.ПланыВидовХарактеристик.Содержит(Мета)
		Или Метаданные.ПланыСчетов.Содержит(Мета)
		Или Метаданные.ПланыВидовРасчета.Содержит(Мета)
		Или Метаданные.БизнесПроцессы.Содержит(Мета)
		Или Метаданные.Задачи.Содержит(Мета) Тогда
		// Ссылочный тип
		НастроитьСписокСсылок(ИмяТаблицы, Наименование);
		НовСтраница = Элементы.СтраницаСписокСсылок;
		
	Иначе
		// Проверим на набор записей
		Измерения = ТекущийОбъект.ИзмеренияНабораЗаписей(ИмяТаблицы);
		Если Измерения <> Неопределено Тогда
			НастроитьНаборЗаписей(ИмяТаблицы, Измерения, Наименование);
			НовСтраница = Элементы.СтраницаНаборЗаписей;
		Иначе
			НастроитьПустуюСтраницу(Наименование, ИмяТаблицы);
			НовСтраница = Элементы.СтраницаПустая;
		КонецЕсли;
		
	КонецЕсли;
	
	Элементы.СтраницаКонстанты.Видимость    = Ложь;
	Элементы.СтраницаСписокСсылок.Видимость = Ложь;
	Элементы.СтраницаНаборЗаписей.Видимость = Ложь;
	Элементы.СтраницаПустая.Видимость       = Ложь;
	
	Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница = НовСтраница;
	НовСтраница.Видимость = Истина;
	
	НастроитьВидимостьКомандОбщегоМеню();
	
КонецПроцедуры

// Вывод изменений для ссылочного типа (справочник, документ, план видов характеристик, 
// план счетов, вид расчета, бизнес-процессы, задачи).
//
&НаСервере
Процедура НастроитьСписокСсылок(ИмяТаблицы, Наименование)
	
	СвойстваСписка = СтруктураСвойствДинамическогоСписка();
	СвойстваСписка.ДинамическоеСчитываниеДанных = Истина;
	СвойстваСписка.ТекстЗапроса = 
	"ВЫБРАТЬ
	|	ТаблицаИзменений.Ссылка КАК Ссылка,
	|	ТаблицаИзменений.НомерСообщения КАК НомерСообщения,
	|	ВЫБОР
	|		КОГДА ТаблицаИзменений.НомерСообщения ЕСТЬ NULL
	|			ТОГДА ИСТИНА
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ КАК НеВыгружалось,
	|	ОсновнаяТаблица.Ссылка КАК СсылкаОбъекта
	|ИЗ
	|	&ИмяТаблицыМетаданныхИзменения КАК ТаблицаИзменений
	|		ЛЕВОЕ СОЕДИНЕНИЕ &ИмяТаблицыМетаданных КАК ОсновнаяТаблица
	|		ПО ТаблицаИзменений.Ссылка = ОсновнаяТаблица.Ссылка
	|ГДЕ
	|	ТаблицаИзменений.Узел = &ВыбранныйУзел";
	
	СвойстваСписка.ТекстЗапроса = СтрЗаменить(СвойстваСписка.ТекстЗапроса, "&ИмяТаблицыМетаданныхИзменения", ИмяТаблицы + ".Изменения");
	СвойстваСписка.ТекстЗапроса = СтрЗаменить(СвойстваСписка.ТекстЗапроса, "&ИмяТаблицыМетаданных", ИмяТаблицы);
		
	УстановитьСвойстваДинамическогоСписка(Элементы.СписокСсылок, СвойстваСписка);
	
	СписокСсылок.Параметры.УстановитьЗначениеПараметра("ВыбранныйУзел", УзелОбменаСсылка);
	СписокСсылокИмяТаблицы = ИмяТаблицы;
	
	// Представление объекта
	Мета = ЭтотОбъект().МетаданныеПоПолномуИмени(ИмяТаблицы);
	ТекЗаголовок = Мета.ПредставлениеОбъекта;
	Если ПустаяСтрока(ТекЗаголовок) Тогда
		ТекЗаголовок = Наименование;
	КонецЕсли;
	Элементы.СписокСсылокСсылкаПредставление.Заголовок = ТекЗаголовок;
КонецПроцедуры

// Вывод изменений для констант.
//
&НаСервере
Процедура НастроитьСписокКонстант(ИмяТаблицы = Неопределено, Наименование = "")
	
	Если ИмяТаблицы = Неопределено Тогда
		// Все константы
		Имена = СтруктураИменМетаданных.Константы;
		Представления = СтруктураПредставленийМетаданных.Константы;
		Авторегистрация = СтруктураАвторегистрацииМетаданных.Константы;
	Иначе
		Имена = Новый Массив;
		Имена.Добавить(ИмяТаблицы);
		Представления = Новый Массив;
		Представления.Добавить(Наименование);
		Индекс = СтруктураИменМетаданных.Константы.Найти(ИмяТаблицы);
		Авторегистрация = Новый Массив;
		Авторегистрация.Добавить(СтруктураАвторегистрацииМетаданных.Константы[Индекс]);
	КонецЕсли;
	
	ШаблонТекстаЗапроса = 
	"ВЫБРАТЬ
	|	&ИндексКартинкиАвторегистрация КАК ИндексКартинкиАвторегистрация,
	|	2 КАК ИндексКартинки,
	|	""&ПользовательскоеПредставлениеКонстанты"" КАК Наименование,
	|	""&ИмяТаблицыМетаданныхПредставление"" КАК МетаПолноеИмя,
	|	ТаблицаИзменений.НомерСообщения КАК НомерСообщения,
	|	ВЫБОР
	|		КОГДА ТаблицаИзменений.НомерСообщения ЕСТЬ NULL
	|			ТОГДА ИСТИНА
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ КАК НеВыгружалось
	|ИЗ
	|	&ИмяТаблицыМетаданных КАК ТаблицаИзменений
	|ГДЕ
	|	ТаблицаИзменений.Узел = &ВыбранныйУзел";
	
	// И помнить про ограничение на количество таблиц.
	Текст = "";
	Для Индекс = 0 По Имена.ВГраница() Цикл
		
		Имя = Имена[Индекс];
		
		Если НЕ ПустаяСтрока(Текст) Тогда
			
			Текст = Текст + Символы.ПС + Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС + Символы.ПС;
			
		КонецЕсли;
		
		ТекстПодзапроса = СтрЗаменить(ШаблонТекстаЗапроса, "&ИндексКартинкиАвторегистрация", Формат(Авторегистрация[Индекс], "ЧН=; ЧГ="));
		ТекстПодзапроса = СтрЗаменить(ТекстПодзапроса, "&ПользовательскоеПредставлениеКонстанты", ОбработатьКавычкиВСтроке(Представления[Индекс]));
		ТекстПодзапроса = СтрЗаменить(ТекстПодзапроса, "&ИмяТаблицыМетаданныхПредставление", Имя);
		ТекстПодзапроса = СтрЗаменить(ТекстПодзапроса, "&ИмяТаблицыМетаданных", ПодставитьПараметрыВСтроку("%1.Изменения", Имя));
		
		Текст = Текст + ТекстПодзапроса;
		
	КонецЦикла;
	
	СвойстваСписка = СтруктураСвойствДинамическогоСписка();
	СвойстваСписка.ДинамическоеСчитываниеДанных = Истина;
	
	ИтоговыйТекстЗапроса = 
	"ВЫБРАТЬ
	|	ИндексКартинкиАвторегистрация,
	|	ИндексКартинки,
	|	МетаПолноеИмя,
	|	НеВыгружалось,
	|	Наименование,
	|	НомерСообщения
	|{ВЫБРАТЬ
	|	ИндексКартинкиАвторегистрация,
	|	ИндексКартинки,
	|	Наименование,
	|	МетаПолноеИмя,
	|	НомерСообщения,
	|	НеВыгружалось}
	|ИЗ
	|	&ТекстВложенногоЗапроса КАК Данные
	|{ГДЕ
	|	Наименование,
	|	НомерСообщения,
	|	НеВыгружалось}";
	
	ИтоговыйТекстЗапроса = СтрЗаменить(ИтоговыйТекстЗапроса, "&ТекстВложенногоЗапроса", ПодставитьПараметрыВСтроку("(%1)", Текст));
	СвойстваСписка.ТекстЗапроса = ИтоговыйТекстЗапроса;
	
	УстановитьСвойстваДинамическогоСписка(Элементы.СписокКонстант, СвойстваСписка);
		
	ЭлементыСписка = СписокКонстант.Порядок.Элементы;
	Если ЭлементыСписка.Количество() = 0 Тогда
		Элемент = ЭлементыСписка.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
		Элемент.Поле = Новый ПолеКомпоновкиДанных("Наименование");
		Элемент.Использование = Истина;
	КонецЕсли;
	
	СписокКонстант.Параметры.УстановитьЗначениеПараметра("ВыбранныйУзел", УзелОбменаСсылка);
КонецПроцедуры	

// Вывод заглушки с пустой страницей.
&НаСервере
Процедура НастроитьПустуюСтраницу(Наименование, ИмяТаблицы = Неопределено)
	
	Если ИмяТаблицы = Неопределено Тогда
		ТекстКоличеств = "";
	Иначе
		Дерево = РеквизитФормыВЗначение("ДеревоМетаданных");
		Строка = Дерево.Строки.Найти(ИмяТаблицы, "МетаПолноеИмя", Истина);
		Если Строка <> Неопределено Тогда
			ТекстКоличеств = НСтр("ru = 'Зарегистрировано объектов: %1
			                          |Выгружено объектов: %2
			                          |Не выгружено объектов: %3'");
	
			ТекстКоличеств = СтрЗаменить(ТекстКоличеств, "%1", Формат(Строка.КоличествоИзменений, "ЧДЦ=0; ЧН="));
			ТекстКоличеств = СтрЗаменить(ТекстКоличеств, "%2", Формат(Строка.КоличествоВыгруженных, "ЧДЦ=0; ЧН="));
			ТекстКоличеств = СтрЗаменить(ТекстКоличеств, "%3", Формат(Строка.КоличествоНевыгруженных, "ЧДЦ=0; ЧН="));
		КонецЕсли;
	КонецЕсли;
	
	Текст = НСтр("ru = '%1.
	                 |
	                 |%2
	                 |Для регистрации или отмены регистрации обмена данными на узле
	                 |""%3""
	                 |выберите тип объекта слева в дереве метаданных и воспользуйтесь
	                 |командами ""Зарегистрировать"" или ""Отменить регистрацию""'");
		
	Текст = СтрЗаменить(Текст, "%1", Наименование);
	Текст = СтрЗаменить(Текст, "%2", ТекстКоличеств);
	Текст = СтрЗаменить(Текст, "%3", УзелОбменаСсылка);
	Элементы.ДекорацияПустаяСтраница.Заголовок = Текст;
КонецПроцедуры

// Вывод изменений для наборов записей.
//
&НаСервере
Процедура НастроитьНаборЗаписей(ИмяТаблицы, Измерения, Наименование)
	
	ТекстВыбора = "";
	Префикс     = "СписокНаборовЗаписей";
	Для Каждого Строка Из Измерения Цикл
		Имя = Строка.Имя;
		ТекстВыбора = ТекстВыбора + ",ТаблицаИзменений." + Имя + " КАК " + Префикс + Имя + Символы.ПС;
		// Чтобы не наступить на измерение "НомерСообщения" или "НеВыгружалось".
		Строка.Имя = Префикс + Имя;
	КонецЦикла;
	
	СвойстваСписка = СтруктураСвойствДинамическогоСписка();
	СвойстваСписка.ДинамическоеСчитываниеДанных = Истина;
	СвойстваСписка.ТекстЗапроса = 
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	ТаблицаИзменений.НомерСообщения КАК НомерСообщения,
	|	ВЫБОР 
	|		КОГДА ТаблицаИзменений.НомерСообщения ЕСТЬ NULL ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ КАК НеВыгружалось
	|
	|	" + ТекстВыбора + "
	|ИЗ
	|	" + ИмяТаблицы + ".Изменения КАК ТаблицаИзменений
	|ГДЕ
	|	ТаблицаИзменений.Узел = &ВыбранныйУзел";
	
	УстановитьСвойстваДинамическогоСписка(Элементы.СписокНаборовЗаписей, СвойстваСписка);
	
	СписокНаборовЗаписей.Параметры.УстановитьЗначениеПараметра("ВыбранныйУзел", УзелОбменаСсылка);
	
	// Добавляем в группу измерений.
	ЭтотОбъект().ДобавитьКолонкиВТаблицуФормы(
		Элементы.СписокНаборовЗаписей, 
		"НомерСообщения, НеВыгружалось, 
		|Порядок, Отбор, Группировка, СтандартнаяКартинка, Параметры, УсловноеОформление",
		Измерения,
		Элементы.СписокНаборовЗаписейГруппаИзмерений);
	
	СписокНаборовЗаписейИмяТаблицы = ИмяТаблицы;
КонецПроцедуры

// Общий отбор по полю "НомерСообщения".
//
&НаСервере
Процедура УстановитьОтборПоНомеруСообщения(ДинамоСписок, Вариант)
	
	Поле = Новый ПолеКомпоновкиДанных("НеВыгружалось");
	// Ищем свое поле, попутно отключаем все по нему.
	ЭлементыСписка = ДинамоСписок.Отбор.Элементы;
	Индекс = ЭлементыСписка.Количество();
	Пока Индекс > 0 Цикл
		Индекс = Индекс - 1;
		Элемент = ЭлементыСписка[Индекс];
		Если Элемент.ЛевоеЗначение = Поле Тогда 
			ЭлементыСписка.Удалить(Элемент);
		КонецЕсли;
	КонецЦикла;
	
	ЭлементОтбора = ЭлементыСписка.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Поле;
	ЭлементОтбора.ВидСравнения  = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.Использование = Ложь;
	ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
	
	Если Вариант = 1 Тогда 		// Выгруженные
		ЭлементОтбора.ПравоеЗначение = Ложь;
		ЭлементОтбора.Использование  = Истина;
		
	ИначеЕсли Вариант = 2 Тогда	// Не выгруженные
		ЭлементОтбора.ПравоеЗначение = Истина;
		ЭлементОтбора.Использование  = Истина;
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура НастроитьВидимостьКомандОбщегоМеню()
	
	ТекСтр = Элементы.ВариантыСпискаОбъектов.ТекущаяСтраница;
	
	Если ТекСтр = Элементы.СтраницаКонстанты Тогда
		Элементы.ФормаДобавитьРегистрациюОдногоОбъекта.Доступность = Истина;
		Элементы.ФормаДобавитьРегистрациюОтбор.Доступность         = Ложь;
		Элементы.ФормаУдалитьРегистрациюОдногоОбъекта.Доступность  = Истина;
		Элементы.ФормаУдалитьРегистрациюОтбор.Доступность          = Ложь;
		
	ИначеЕсли ТекСтр = Элементы.СтраницаСписокСсылок Тогда
		Элементы.ФормаДобавитьРегистрациюОдногоОбъекта.Доступность = Истина;
		Элементы.ФормаДобавитьРегистрациюОтбор.Доступность         = Истина;
		Элементы.ФормаУдалитьРегистрациюОдногоОбъекта.Доступность  = Истина;
		Элементы.ФормаУдалитьРегистрациюОтбор.Доступность          = Истина;
		
	ИначеЕсли ТекСтр = Элементы.СтраницаНаборЗаписей Тогда
		Элементы.ФормаДобавитьРегистрациюОдногоОбъекта.Доступность = Истина;
		Элементы.ФормаДобавитьРегистрациюОтбор.Доступность         = Ложь;
		Элементы.ФормаУдалитьРегистрациюОдногоОбъекта.Доступность  = Истина;
		Элементы.ФормаУдалитьРегистрациюОтбор.Доступность          = Ложь;
		
	Иначе
		Элементы.ФормаДобавитьРегистрациюОдногоОбъекта.Доступность = Ложь;
		Элементы.ФормаДобавитьРегистрациюОтбор.Доступность         = Ложь;
		Элементы.ФормаУдалитьРегистрациюОдногоОбъекта.Доступность  = Ложь;
		Элементы.ФормаУдалитьРегистрациюОтбор.Доступность          = Ложь;
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция МассивИменКлючейНабораЗаписей(ИмяТаблицы, ПрефиксИмен = "")
	Результат = Новый Массив;
	Измерения = ЭтотОбъект().ИзмеренияНабораЗаписей(ИмяТаблицы);
	Если Измерения <> Неопределено Тогда
		Для Каждого Строка Из Измерения Цикл
			Результат.Добавить(ПрефиксИмен + Строка.Имя);
		КонецЦикла;
	КонецЕсли;
	Возврат Результат;
КонецФункции	

&НаСервере
Функция МенеджерПоМетаданным(ИмяТаблицы) 
	Описание = ЭтотОбъект().ХарактеристикиПоМетаданным(ИмяТаблицы);
	Если Описание <> Неопределено Тогда
		Возврат Описание.Менеджер;
	КонецЕсли;
	Возврат Неопределено;
КонецФункции

&НаСервере
Функция ТекстСериализации(Сериализация)
	
	ОбработкаОбъект = ЭтотОбъект();
	
	Текст = Новый ТекстовыйДокумент;
	
	Запись = Новый ЗаписьXML;
	Для Каждого Элемент Из Сериализация Цикл
		Запись.УстановитьСтроку("UTF-16");
		Значение = Неопределено;
		
		Если Элемент.ФлагТипа = 1 Тогда
			// Метаданные
			Менеджер = МенеджерПоМетаданным(Элемент.Данные);
			Значение = Менеджер.СоздатьМенеджерЗначения();
			
		ИначеЕсли Элемент.ФлагТипа = 2 Тогда
			// Набор данных с отбором
			Менеджер = МенеджерПоМетаданным(СписокНаборовЗаписейИмяТаблицы);
			Значение = Менеджер.СоздатьНаборЗаписей();
			Для Каждого ИмяЗначение Из Элемент.Данные Цикл
				ОбработкаОбъект.УстановитьЗначениеЭлементаОтбора(Значение.Отбор, ИмяЗначение.Ключ, ИмяЗначение.Значение);
			КонецЦикла;
			Значение.Прочитать();
			
		ИначеЕсли Элемент.ФлагТипа = 3 Тогда
			// Ссылка
			Значение = Элемент.Данные.ПолучитьОбъект();
			Если Значение = Неопределено Тогда
				Значение = Новый УдалениеОбъекта(Элемент.Данные);
			КонецЕсли;
		КонецЕсли;
		
		ЗаписатьXML(Запись, Значение);
		Текст.ДобавитьСтроку(Запись.Закрыть());
	КонецЦикла;
	
	Возврат Текст;
КонецФункции	

&НаСервере
Функция УдалитьРегистрациюНаСервере(БезУчетаАвторегистрации, Удаляемые, ИмяТаблицы = Неопределено)
	ПараметрыРегистрации = ПодготовитьПараметрыИзмененияРегистрации(Ложь, БезУчетаАвторегистрации, Удаляемые, ИмяТаблицы);
	Возврат ЭтотОбъект().ВыполнитьИзменениеРегистрации(ПараметрыРегистрации);
КонецФункции

&НаСервере
Функция ДобавитьРегистрациюНаСервере(БезУчетаАвторегистрации, Добавляемые, ИмяТаблицы = Неопределено)
	ПараметрыРегистрации = ПодготовитьПараметрыИзмененияРегистрации(Истина, БезУчетаАвторегистрации, Добавляемые, ИмяТаблицы);
	Возврат ЭтотОбъект().ВыполнитьИзменениеРегистрации(ПараметрыРегистрации);
КонецФункции

&НаСервере
Функция ИзменитьНомерСообщенияНаСервере(НомерСообщения, Данные, ИмяТаблицы = Неопределено)
	ПараметрыРегистрации = ПодготовитьПараметрыИзмененияРегистрации(НомерСообщения, Истина, Данные, ИмяТаблицы);
	Возврат ЭтотОбъект().ВыполнитьИзменениеРегистрации(ПараметрыРегистрации);
КонецФункции

&НаСервере
Функция ПолучитьОписаниеВыбранныхМетаданных(БезУчетаАвторегистрации, МетаИмяГруппа = Неопределено, МетаИмяУзел = Неопределено)
    
	Если МетаИмяГруппа = Неопределено И МетаИмяУзел = Неопределено Тогда
		// Не указано ничего
		Текст = НСтр("ru = 'все объекты %1 по выбранной иерархии вида'");
		
	ИначеЕсли МетаИмяГруппа <> Неопределено И МетаИмяУзел = Неопределено Тогда
		// Указана только группа, рассматриваем ее как наименование группы.
		Текст = "%2 %1";
		
	ИначеЕсли МетаИмяГруппа = Неопределено И МетаИмяУзел <> Неопределено Тогда
		// Указан только узел, рассматриваем как много выделенных объектов.
		Текст = НСтр("ru = 'все объекты %1 по выбранной иерархии вида'");
		
	Иначе
		// Указаны и группа и узел, рассматриваем как имена метаданных.
		Текст = НСтр("ru = 'все объекты типа ""%3"" %1'");
		
	КонецЕсли;
	
	Если БезУчетаАвторегистрации Тогда
		ТекстФлага = "";
	Иначе
		ТекстФлага = НСтр("ru = 'с признаком авторегистрации'");
	КонецЕсли;
	
	Представление = "";
	Для Каждого КлючЗначение Из СтруктураПредставленийМетаданных Цикл
		Если КлючЗначение.Ключ = МетаИмяГруппа Тогда
			Индекс = СтруктураИменМетаданных[МетаИмяГруппа].Найти(МетаИмяУзел);
			Представление = ?(Индекс = Неопределено, "", КлючЗначение.Значение[Индекс]);
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	Текст = СтрЗаменить(Текст, "%1", ТекстФлага);
	Текст = СтрЗаменить(Текст, "%2", НРег(МетаИмяГруппа));
	Текст = СтрЗаменить(Текст, "%3", Представление);
	
	Возврат СокрЛП(Текст);
КонецФункции

&НаСервере
Функция ПолучитьИменаМетаданныхТекущейСтроки(БезУчетаАвторегистрации) 
	
	Строка = ДеревоМетаданных.НайтиПоИдентификатору(Элементы.ДеревоМетаданных.ТекущаяСтрока);
	Если Строка = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Результат = Новый Структура("МетаИмена, Описание", 
		Новый Массив, ПолучитьОписаниеВыбранныхМетаданных(БезУчетаАвторегистрации));
	МетаИмя = Строка.МетаПолноеИмя;
	Если ПустаяСтрока(МетаИмя) Тогда
		Результат.МетаИмена.Добавить(Неопределено);	
	Иначе
		Результат.МетаИмена.Добавить(МетаИмя);	
		
		Родитель = Строка.ПолучитьРодителя();
		МетаРодительИмя = Родитель.МетаПолноеИмя;
		Если ПустаяСтрока(МетаРодительИмя) Тогда
			Результат.Описание = ПолучитьОписаниеВыбранныхМетаданных(БезУчетаАвторегистрации, Строка.Наименование);
		Иначе
			Результат.Описание = ПолучитьОписаниеВыбранныхМетаданных(БезУчетаАвторегистрации, МетаРодительИмя, МетаИмя);
		КонецЕсли;
	КонецЕсли;
	
	Возврат Результат;
КонецФункции

&НаСервере
Функция ПолучитьВыбранныеИменаМетаданных(БезУчетаАвторегистрации)
	
	Результат = Новый Структура("МетаИмена, Описание", 
		Новый Массив, ПолучитьОписаниеВыбранныхМетаданных(БезУчетаАвторегистрации));
	
	Для Каждого Корень Из ДеревоМетаданных.ПолучитьЭлементы() Цикл
		
		Если Корень.Пометка = 1 Тогда
			Результат.МетаИмена.Добавить(Неопределено);
			Возврат Результат;
		КонецЕсли;
		
		КоличествоЧастичных = 0;
		КоличествоГрупп     = 0;
		КоличествоУзлов     = 0;
		Для Каждого Группа Из Корень.ПолучитьЭлементы() Цикл
			
			Если Группа.Пометка = 0 Тогда
				Продолжить;
			ИначеЕсли Группа.Пометка = 1 Тогда
				//	Весь группа целиком, смотрим откуда выбирать значения.
				КоличествоГрупп = КоличествоГрупп + 1;
				ОписаниеГруппы = ПолучитьОписаниеВыбранныхМетаданных(БезУчетаАвторегистрации, Группа.Наименование);
				
				Если Группа.ПолучитьЭлементы().Количество() = 0 Тогда
					// Пробуем из структуры имен метаданных, считаем все отмеченными.
					МассивАвто = СтруктураАвторегистрацииМетаданных[Группа.МетаПолноеИмя];
					МассивИмен = СтруктураИменМетаданных[Группа.МетаПолноеИмя];
					Для Индекс = 0 По МассивИмен.ВГраница() Цикл
						Если БезУчетаАвторегистрации Или МассивАвто[Индекс] = 2 Тогда
							Результат.МетаИмена.Добавить(МассивИмен[Индекс]);
							ОписаниеУзла = ПолучитьОписаниеВыбранныхМетаданных(БезУчетаАвторегистрации, Группа.МетаПолноеИмя, МассивИмен[Индекс]);
						КонецЕсли;
					КонецЦикла;
					
					Продолжить;
				КонецЕсли;
				
			Иначе
				КоличествоЧастичных = КоличествоЧастичных + 1;
			КонецЕсли;
			
			Для Каждого Узел Из Группа.ПолучитьЭлементы() Цикл
				Если Узел.Пометка = 1 Тогда
					// Узел.Авторегистрация = 2 -> разрешена
					Если БезУчетаАвторегистрации Или Узел.Авторегистрация = 2 Тогда
						Результат.МетаИмена.Добавить(Узел.МетаПолноеИмя);
						ОписаниеУзла = ПолучитьОписаниеВыбранныхМетаданных(БезУчетаАвторегистрации, Группа.МетаПолноеИмя, Узел.МетаПолноеИмя);
						КоличествоУзлов = КоличествоУзлов + 1;
					КонецЕсли;
				КонецЕсли
			КонецЦикла;
			
		КонецЦикла;
		
		Если КоличествоГрупп = 1 И КоличествоЧастичных = 0 Тогда
			Результат.Описание = ОписаниеГруппы;
		ИначеЕсли КоличествоГрупп = 0 И КоличествоУзлов = 1 Тогда
			Результат.Описание = ОписаниеУзла;
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Результат;
КонецФункции

&НаСервере
Функция ПрочитатьНомераСообщений()
	
	РеквизитыЗапроса = "НомерОтправленного, НомерПринятого";
	
	Данные = ЭтотОбъект().ПолучитьПараметрыУзлаОбмена(УзелОбменаСсылка, РеквизитыЗапроса);
	
	Возврат Данные;
	
КонецФункции

&НаСервере
Процедура ОбработатьЗапретИзмененияУзла()
	ОперацииРазрешены = Не ЗапрещеноВыбиратьУзелОбмена;
	
	Если ОперацииРазрешены Тогда
		Элементы.УзелОбменаСсылка.Видимость = Истина;
		Заголовок = НСтр("ru = 'Регистрация изменений для обмена данными'");
	Иначе
		Элементы.УзелОбменаСсылка.Видимость = Ложь;
		Заголовок = СтрЗаменить(НСтр("ru = 'Регистрация изменений для обмена с  ""%1""'"), "%1", Строка(УзелОбменаСсылка));
	КонецЕсли;
	
	Элементы.ФормаОткрытьФормуРегистрацииНаУзлах.Видимость = ОперацииРазрешены;
	
	Элементы.СписокКонстантКонтекстноеМенюОткрытьФормуРегистрацииНаУзлах.Видимость       = ОперацииРазрешены;
	Элементы.СписокСсылокКонтекстноеМенюОткрытьФормуРегистрацииНаУзлах.Видимость         = ОперацииРазрешены;
	Элементы.СписокНаборовЗаписейКонтекстноеМенюОткрытьФормуРегистрацииНаУзлах.Видимость = ОперацииРазрешены;
КонецПроцедуры

&НаСервере
Функция ПроконтролироватьНастройки()
	Результат = Истина;
	
	// Проверим на допустимость узла пришедшего из параметра или настроек.
	ТекущийОбъект = ЭтотОбъект();
	Если УзелОбменаСсылка <> Неопределено И ПланыОбмена.ТипВсеСсылки().СодержитТип(ТипЗнч(УзелОбменаСсылка)) Тогда
		ДопустимыеУзлыОбмена = ТекущийОбъект.СформироватьДеревоУзлов();
		ИмяПлана = УзелОбменаСсылка.Метаданные().Имя;
		Если ДопустимыеУзлыОбмена.Строки.Найти(ИмяПлана, "ПланОбменаИмя", Истина) = Неопределено Тогда
			// Узел неверного плана обмена.
			УзелОбменаСсылка = Неопределено;
			Результат = Ложь;
		ИначеЕсли УзелОбменаСсылка = ПланыОбмена[ИмяПлана].ЭтотУзел() Тогда
			// Этот узел
			УзелОбменаСсылка = Неопределено;
			Результат = Ложь;
		КонецЕсли;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		ОбработкаВыбораУзлаОбменаСервер();
	КонецЕсли;
	ОбработатьЗапретИзмененияУзла();
	
	// Зависимость настроек
	УстановитьОтборыВДинамическихСписках();
	
	Возврат Результат;
КонецФункции

&НаСервере
Процедура УстановитьОтборыВДинамическихСписках()
	УстановитьОтборПоНомеруСообщения(СписокКонстант,       ВариантОтбораПоНомеруСообщения);
	УстановитьОтборПоНомеруСообщения(СписокСсылок,         ВариантОтбораПоНомеруСообщения);
	УстановитьОтборПоНомеруСообщения(СписокНаборовЗаписей, ВариантОтбораПоНомеруСообщения);
КонецПроцедуры

&НаСервере
Функция СтруктураКлючаНабораЗаписей(Знач ТекущиеДанные)
	
	ОбработкаОбъект = ЭтотОбъект();
	
	Описание = ОбработкаОбъект.ХарактеристикиПоМетаданным(СписокНаборовЗаписейИмяТаблицы);
	
	Если Описание = Неопределено Тогда
		// Неизвестный источник
		Возврат Неопределено;
	КонецЕсли;
	
	Результат = Новый Структура("ИмяФормы, Параметр, Значение");
	
	Измерения = Новый Структура;
	ИменаКлючей = МассивИменКлючейНабораЗаписей(СписокНаборовЗаписейИмяТаблицы);
	
	Для Каждого Имя Из ИменаКлючей Цикл
		ИмяКолонки = "СписокНаборовЗаписей" + Имя;
		Если ТекущиеДанные.Свойство(ИмяКолонки) Тогда
			Измерения.Вставить(Имя, ТекущиеДанные[ИмяКолонки]);
		КонецЕсли;	
	КонецЦикла;
	
	Если Измерения.Свойство("Регистратор") Тогда
		МетаРегистратора = Метаданные.НайтиПоТипу(ТипЗнч(Измерения.Регистратор));
		Если МетаРегистратора = Неопределено Тогда
			Результат = Неопределено;
		Иначе
			Результат.ИмяФормы = МетаРегистратора.ПолноеИмя() + ".ФормаОбъекта";
			Результат.Параметр = "Ключ";
			Результат.Значение = Измерения.Регистратор;
		КонецЕсли;
		
	ИначеЕсли Измерения.Количество() = 0 Тогда
		// Вырожденный набор записей
		Результат.ИмяФормы = СписокНаборовЗаписейИмяТаблицы + ".ФормаСписка";
		
	Иначе
		Набор = Описание.Менеджер.СоздатьНаборЗаписей(); // РегистрСведенийНаборЗаписей, и т.п.
		Для Каждого КлючЗначение Из Измерения Цикл
			ОбработкаОбъект.УстановитьЗначениеЭлементаОтбора(Набор.Отбор, КлючЗначение.Ключ, КлючЗначение.Значение);
		КонецЦикла;
		Набор.Прочитать();
		Если Набор.Количество() = 1 Тогда
			// Одиночный элемент
			Результат.ИмяФормы = СписокНаборовЗаписейИмяТаблицы + ".ФормаЗаписи";
			Результат.Параметр = "Ключ";
			
			Ключ = Новый Структура;
			Для Каждого КолонкаНабора Из Набор.Выгрузить().Колонки Цикл
				ИмяКолонки = КолонкаНабора.Имя;
				Ключ.Вставить(ИмяКолонки, Набор[0][ИмяКолонки]);
			КонецЦикла;
			Результат.Значение = Описание.Менеджер.СоздатьКлючЗаписи(Ключ);
		Иначе
			// Список
			Результат.ИмяФормы = СписокНаборовЗаписейИмяТаблицы + ".ФормаСписка";
			Результат.Параметр = "Отбор";
			Результат.Значение = Измерения;
		КонецЕсли;
		
	КонецЕсли;
	
	Возврат Результат;
КонецФункции

&НаСервере
Процедура ПроверитьВерсиюИРежимСовместимостиПлатформы()
	
	Информация = Новый СистемнаяИнформация;
	Если Не (Лев(Информация.ВерсияПриложения, 3) = "8.3"
		И (Метаданные.РежимСовместимости = Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать
		Или (Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.Версия8_1
		И Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.Версия8_2_13
		И Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости["Версия8_2_16"]
		И Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости["Версия8_3_1"]
		И Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости["Версия8_3_2"]
		И Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости["Версия8_3_3"]
		И Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости["Версия8_3_4"]))) Тогда
		
		ВызватьИсключение НСтр("ru = 'Обработка предназначена для запуска на версии платформы
			|1С:Предприятие 8.3.5 с отключенным режимом совместимости или выше'");
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция ЗарегистрироватьИОМИПредопределенныеНаСервере()
	
	ТекущийОбъект = ЭтотОбъект();
	Возврат ТекущийОбъект.БСП_ОбновитьИЗарегистрироватьИОМГлавногоУзла(УзелОбменаСсылка);
	
КонецФункции

&НаСервере
Функция ПодготовитьПараметрыИзмененияРегистрации(Команда, БезУчетаАвторегистрации, Данные, ИмяТаблицы = Неопределено)
	Результат = Новый Структура;
	Результат.Вставить("Команда", Команда);
	Результат.Вставить("БезУчетаАвторегистрации", БезУчетаАвторегистрации);
	Результат.Вставить("Узел", УзелОбменаСсылка);
	Результат.Вставить("Данные", Данные);
	Результат.Вставить("ИмяТаблицы", ИмяТаблицы);
	
	Результат.Вставить("КонфигурацияПоддерживаетБСП",       Объект.КонфигурацияПоддерживаетБСП);
	Результат.Вставить("ДоступнаРегистрацияСредствамиБСП",  Объект.ДоступнаРегистрацияСредствамиБСП);
	Результат.Вставить("ДоступнаРаботаРИБ",                 Объект.ДоступнаРаботаРИБ);
	Результат.Вставить("НастройкаКонтрольВыгрузкиОбъектов", Объект.НастройкаКонтрольВыгрузкиОбъектов);
	Результат.Вставить("ДоступнаПакетнаяРегистрация",       Объект.ДоступнаПакетнаяРегистрация);
	
	Результат.Вставить("СтруктураИменМетаданных",           СтруктураИменМетаданных);
	
	Возврат Результат;
КонецФункции

&НаСервере
Процедура ДополнитьИменаСкрываемыхМетаданных()
	// Скрываются регистры у которых есть измерение Узел
	Для Каждого РегистрСведенийМетаданные Из Метаданные.РегистрыСведений Цикл
		Для Каждого ИзмерениеРегистра Из РегистрСведенийМетаданные.Измерения Цикл
			Если НРег(ИзмерениеРегистра.Имя) = "узел" Тогда
				Объект.ИменаСкрываемыхМетаданных.Добавить("РегистрСведений." + РегистрСведенийМетаданные.Имя);
				Прервать;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура УстановитьСвойстваДинамическогоСписка(Список, СтруктураПараметров)
	
	Форма = Список.Родитель;
	
	Пока ТипЗнч(Форма) <> Тип("ФормаКлиентскогоПриложения") Цикл
		Форма = Форма.Родитель;
	КонецЦикла;
	
	ДинамическийСписок = Форма[Список.ПутьКДанным];
	ТекстЗапроса = СтруктураПараметров.ТекстЗапроса;
	
	Если Не ПустаяСтрока(ТекстЗапроса) Тогда
		ДинамическийСписок.ТекстЗапроса = ТекстЗапроса;
	КонецЕсли;
	
	ОсновнаяТаблица = СтруктураПараметров.ОсновнаяТаблица;
	
	Если Не ПустаяСтрока(ОсновнаяТаблица) Тогда
		ДинамическийСписок.ОсновнаяТаблица = ОсновнаяТаблица;
	КонецЕсли;
	
	ДинамическоеСчитываниеДанных = СтруктураПараметров.ДинамическоеСчитываниеДанных;
	
	Если ТипЗнч(ДинамическоеСчитываниеДанных) = Тип("Булево") Тогда
		ДинамическийСписок.ДинамическоеСчитываниеДанных = ДинамическоеСчитываниеДанных;
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция СтруктураСвойствДинамическогоСписка()
	
	Возврат Новый Структура("ТекстЗапроса, ОсновнаяТаблица, ДинамическоеСчитываниеДанных");
	
КонецФункции

&НаСервере
Процедура ЗаполнитьДополнительнуюИнформацию()
	
	Если НЕ КонфигурацияПоддерживаетБСД() Тогда
		Элементы.ГруппаДополнительнаяИнформация.Видимость = Ложь;
		Возврат;
	КонецЕсли;
	
	МодульОбменДаннымиПовтИсп = ОбщийМодульОбменДаннымиПовтИсп();
	МодульОбменДаннымиРегистрацияПовтИсп = ОбщийМодульОбменДаннымиРегистрацияПовтИсп();
	МодульОбменДаннымиРегистрацияСервер = ОбщийМодульОбменДаннымиРегистрацияСервер();
	
	Если ЗначениеЗаполнено(УзелОбменаСсылка) Тогда
		
		ИмяПланаОбмена = МодульОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(УзелОбменаСсылка);
		
		Если МодульОбменДаннымиПовтИсп.ЭтоУзелОбменаДаннымиБСП(УзелОбменаСсылка)
			И (МодульОбменДаннымиПовтИсп.ЭтоУзелСтандартногоОбменаДанными(ИмяПланаОбмена)
				ИЛИ МодульОбменДаннымиПовтИсп.ЭтоУзелУниверсальногоОбменаДанными(УзелОбменаСсылка)) Тогда
			
			РежимВыборочнойРегистрации = МодульОбменДаннымиРегистрацияПовтИсп.РежимВыборочнойРегистрацииДанныхПланаОбмена(ИмяПланаОбмена);
			Если РежимВыборочнойРегистрации = МодульОбменДаннымиРегистрацияСервер.РежимВыборочнойРегистрацииОтключен()Тогда
				
				ТекстЗаголовка = НСтр("ru='отключен.'", КодОсновногоЯзыка());
				
			ИначеЕсли РежимВыборочнойРегистрации = МодульОбменДаннымиРегистрацияСервер.РежимВыборочнойРегистрацииМодифицированность() Тогда
				
				ТекстЗаголовка = НСтр("ru='модифицированность.'", КодОсновногоЯзыка());
				
			Иначе
				
				ТекстЗаголовка = НСтр("ru='согласно правилам xml.'", КодОсновногоЯзыка());
				
			КонецЕсли;
			
		Иначе
			
			ТекстЗаголовка = НСтр("ru='не поддерживается.'", КодОсновногоЯзыка());
			
		КонецЕсли;
		
	Иначе
		
		ТекстЗаголовка = НСтр("ru='укажите настройку синхронизации.'", КодОсновногоЯзыка());
		
	КонецЕсли;
	
	ШаблонЗаголовка = НСтр("ru ='Режим выборочной регистрации: %1'", КодОсновногоЯзыка());
	ТекстЗаголовка = СтрШаблон(ШаблонЗаголовка, ТекстЗаголовка);
	Элементы.ДекорацияРежимВыборочнойРегистрации.Заголовок = ТекстЗаголовка;
	
КонецПроцедуры

&НаСервере
Функция КонфигурацияПоддерживаетБСД()
	
	Возврат Метаданные.Подсистемы.Найти("СтандартныеПодсистемы") <> Неопределено
		И Метаданные.Подсистемы["СтандартныеПодсистемы"].Подсистемы.Найти("ОбменДанными") <> Неопределено
		И Метаданные.Подсистемы["СтандартныеПодсистемы"].Подсистемы["ОбменДанными"].Подсистемы.Найти("Регистрация") <> Неопределено; 
	
КонецФункции

&НаСервере
Функция ОбщийМодульОбменДаннымиПовтИсп()
	Возврат Вычислить("ОбменДаннымиПовтИсп"); // АПК:488 Вызов ВычислитьВБезопасномРежиме не требуется, т.к. для вычисления передается строковый литерал.
КонецФункции

&НаСервере
Функция ОбщийМодульОбменДаннымиРегистрацияПовтИсп()
	Возврат Вычислить("ОбменДаннымиРегистрацияПовтИсп"); // АПК:488 Вызов ВычислитьВБезопасномРежиме не требуется, т.к. для вычисления передается строковый литерал.
КонецФункции

&НаСервере
Функция ОбщийМодульОбменДаннымиРегистрацияСервер()
	Возврат Вычислить("ОбменДаннымиРегистрацияСервер"); // АПК:488 Вызов ВычислитьВБезопасномРежиме не требуется, т.к. для вычисления передается строковый литерал.
КонецФункции


////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции из базовой функциональности для обеспечения автономности.

&НаСервере
Функция ПодставитьПараметрыВСтроку(Знач СтрокаПодстановки, Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено)
	
	СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%1", Параметр1);
	СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%2", Параметр2);
	СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%3", Параметр3);
	
	Возврат СтрокаПодстановки;
	
КонецФункции

&НаСервере 
Функция КодОсновногоЯзыка()
	
	Возврат Метаданные.ОсновнойЯзык.КодЯзыка;
	
КонецФункции

#КонецОбласти